[英]A persistent connection with JDBC to MySQL
我有一个使用JDBC连接到MySQL的应用程序。 有些情况下,JDBC连接闲置数小时(甚至几天),并且它失去了与MySQL的连接,然后在尝试执行查询时排除。 什么是最好的解决方案?
在一段时间内保持连接打开是一种不好的做法。 当DB打开很长时间时,DB会强制关闭。 您应该编写JDBC代码,以便它始终关闭您获取它们的同一个try
块的finally
块中的连接(以及语句和结果集),以防止资源泄漏。
但是,在每次打嗝时获取连接确实是一项非常昂贵的任务,因此您希望使用连接池 。 体面的连接池将自行管理打开,测试,重用和关闭连接。 但这并不意味着您可以将JDBC代码更改为永不关闭它们。 您仍然需要关闭它们,因为这实际上会将底层连接释放回池中以供将来重用。
有几个连接池,比如Apache DBCP ,它是单线程的,因此性能很差, C3P0是多线程的,性能更好,而Tomcat JDBC适用于你使用Tomcat并且不想使用内置DBCP的情况表现不好。
您可以通过编程方式创建连接池,这是C3P0的示例:
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/dbname");
dataSource.setUser("username");
dataSource.setPassword("password");
在应用程序启动期间执行一次,然后您可以按如下方式使用它:
Connection connection = null;
// ...
try {
connection = dataSource.getConnection();
// ...
} finally {
// ...
if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
}
当你在一个支持JNDI的容器(如servletcontainer)(例如Tomcat)中运行时,你也可以将它声明为java.sql.DataSource
( 这里是 Tomcat特定的手册)。 然后它将使用servletcontainer提供的连接池设施。 然后,您可以按如下方式获取数据源:
DataSource dataSource = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/YourDataSourceName");
有些库,例如Apache的DBCP ,可以进行连接池。 部分原因是它们可以设置为在您使用它时自动测试连接(例如“SELECT NOW()FROM DUAL”或其他无害的东西)并在必要时自动重新建立连接,允许您申请假装连接是永恒的。
点击这里:
基本上,您应该使用DataSource并在使用之前始终执行getConnection()。 除非出现严重错误,否则DataSource会在必要时重新连接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.