我的 Web 应用程序中的数据库连接存在严重问题。由于我对单例数据库类的整个应用程序使用单个数据库连接,因此如果我尝试并发数据库操作(两个用户),数据库将回滚事务。
这是我使用的静态方法:
所有线程/servlet 都调用静态 Database.doSomething(...) 方法,该方法又调用以下方法。
private static /* synchronized*/ Connection getConnection(final boolean autoCommit) throws SQLException {
if (con == null) {
con = new MyRegistrationBean().getConnection();
}
con.setAutoCommit(true); //TODO
return con;
}
管理我拥有的数据库连接的推荐方法是什么,这样我就不会遇到同样的问题。
保持一个Connection
永远开放是一个非常糟糕的主意。它没有无限的生命周期,只要数据库超时连接并关闭它,您的应用程序就可能崩溃。最佳实践是获取and close Connection
, Statement
and ResultSet
in the shortest避免资源泄漏以及泄漏和超时导致的潜在应用程序崩溃的可能范围。
由于连接数据库是一项昂贵的任务,因此您应该考虑使用连接池来提高连接性能。一个像样的应用程序服务器/servlet容器通常已经提供了 JNDI 风格的连接池功能DataSource
。有关如何创建它的详细信息,请参阅其文档。例如,如果是 Tomcat,您可以找到它here http://tomcat.apache.org/tomcat-8.0-doc/jndi-resources-howto.html.
即使使用连接池,您仍然必须编写正确的 JDBC 代码: acquireand在尽可能短的范围内关闭所有资源。连接池将轮流担心实际关闭连接或只是将其释放回池以供进一步重用。
您可能会从中获得更多见解本文 http://balusc.blogspot.com/2008/07/dao-tutorial-data-layer.html如何以正确的方式学习 JDBC 基础知识。作为完全不同的替代方案,请学习 EJB 和 JPA。它将为您将所有 JDBC 样板抽象为 oneliners。
希望这可以帮助。
也可以看看:
- 在多线程系统中使用静态 java.sql.Connection 实例是否安全? https://stackoverflow.com/questions/9428573/is-it-safe-to-use-a-static-java-sql-connection-instance-in-a-multithreaded-syste/
- 我是否使用 JDBC 连接池? https://stackoverflow.com/questions/7592056/am-i-using-jdbc-connection-pooling
- 我应该如何在基于 servlet 的应用程序中连接到 JDBC 数据库/数据源? https://stackoverflow.com/questions/2299469/how-should-i-connect-to-a-mysql-data-source-from-eclipse/
- 什么时候有必要或方便使用 Spring 或 EJB3 或全部一起使用? https://stackoverflow.com/questions/18369356/when-is-it-necessary-or-convenient-to-use-springjsf2-or-ejb3jsf2-or-all-of-the/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)