我仍在研究提到here的同样问题.它似乎工作正常,特别是在创建如下所示的AbstractModel类之后:
public abstract class AbstractModel { protected static Connection myConnection = SingletonConnection.instance().establishConnection(); protected static Statement stmt; protected static ResultSet rs; protected boolean loginCheck; // if userId and userLoginHistoryId are valid - true, else false protected boolean userLoggedIn; // if user is already logged in - true, else false public AbstractModel (int userId, Long userLoginHistoryId){ createConnection(); // establish connection loginCheck = false; userLoggedIn = false; if (userId == 0 && userLoginHistoryId == 0){ // special case for login loginCheck = true; // 0, 0, false, false userLoggedIn = false; // set loginCheck to true, userLogged in to false } else { userLoggedIn = true; try{ String query = "select \"user_login_session_check\"(" userId ", " userLoginHistoryId ");"; System.out.println("query: " query); stmt = myConnection.createStatement(); rs = stmt.executeQuery(query); while (rs.next()){ loginCheck = rs.getBoolean(1); } } catch (SQLException e){ System.out.println("SQL Exception: "); e.printStackTrace(); } } } // close connection public void closeConnection(){ try{ myConnection.close(); } catch (SQLException e){ System.out.println("SQL Exception: "); e.printStackTrace(); } } // establish connection public void createConnection(){ myConnection = SingletonConnection.instance().establishConnection(); } // login session check public boolean expiredLoginCheck (){ if (loginCheck == false && userLoggedIn == true){ closeConnection(); return false; } else { return true; } }}
我已经在上面问题的链接中发布了存储过程和Singleton Pattern实现.
我的印象是,在每次单个数据事务之后,我不需要关闭与数据库的连接,因为它只会减慢应用程序的速度.我正在为我正在构建的这个系统寻找大约30个用户,因此性能和可用性非常重要.
延长至少3-4次数据交易的连接是否正确?例如.验证检查某些表单的用户输入,或类似于谷歌的自动建议…这些都是基于用户输入的单独存储的函数调用.我可以使用一个连接实例,而不是在每次数据事务后连接和断开连接吗?哪个更有效率?
如果我的假设是正确的(使用一个连接实例更有效),那么应该在控制器中处理连接的打开和关闭,这就是我创建createConnection()和closeConnection()方法的原因.
谢谢.
解决方法:
像Tomasz说的那样,你永远不应该依赖于你的应用程序将被少数客户使用的事实.在一定时间后驱动程序将超时的事实并不能保证您将拥有足够的可用连接.想象一下:很多数据库预先配置了最大连接数设置为(比如说)15和超时(比方说)10-15分钟.如果你有30个客户端,并且每个客户端都进行了一次操作,那么在中途的某个地方你就会遇到连接问题.
您应该通过以下方式处理连接,文件,流和其他资源:
public void doSomething(){ Connection connection = null; Statement stmt = null; ResultSet rs = null; final String sql = "SELECT ...."); try { connection = getConnection(); stmt = connection.createStatement(); rs = stmt.executeQuery(sql); if (rs.next()) { // Do something here... } } catch (SQLException e) { e.printStackTrace(); } finally { closeResultSet(rs); closeStatement(stmt); closeConnection(connection); }}
try / catch / finally保证无论结果如何,连接都将被关闭.如果出现某种类型的故障,那么finally块仍将关闭连接,就像它可以做的那样,如果事情还可以的话.
同样,对于文件和流,您需要执行相同的操作.在try / catch / finally之外将相应对象初始化为null,然后按照上面的方法操作.
这种误解使得许多Java应用程序在Windows下行为不端,人们不会关闭文件(流到文件等)并且这些文件被锁定,迫使你要么杀掉JVM,要么重启你的机器.
您也可以使用连接池,例如Apache的DBCP,但即使这样,您也应该关闭资源,尽管在内部,不同的连接池实现不一定会关闭连接.
来源:http://www.icode9.com/content-1-245801.html联系客服