Pol*_*878 12 java mysql database multithreading
我想使用与Java的池连接(因为每个线程创建一个连接的成本很高)所以我正在使用该MysqlConnectionPoolDataSource()
对象.我在线程中持久化我的数据源.所以,我只在整个应用程序中使用一个数据源,如下所示:
startRegistry(); // creates an RMI registry for MySQL
MysqlConnectionPoolDataSource dataSource = new MysqlConnectionPoolDataSource();
dataSource.setUser("username");
dataSource.setPassword("password");
dataSource.setServerName("serverIP");
dataSource.setPort(3306);
dataSource.setDatabaseName("dbname");
InitialContext context = createContext(); // Creates a context
context.rebind("MySQLDS", dataSource);
Run Code Online (Sandbox Code Playgroud)
现在我创建了自己的数据源,我在每个单独的线程中执行以下操作:
PooledConnection connect = dataSource.getPooledConnection();
Connection sqlConnection = connect.getConnection();
Statement state = sqlConnection.createStatement();
ResultSet result = state.executeQuery("select * from someTable");
// Continue processing results
Run Code Online (Sandbox Code Playgroud)
我想我很困惑的是调用dataSource.getPooledConnection();
是否真的取得了汇集连接? 这个线程安全吗?我注意到PooledConnection有像notify()和wait()这样的方法......这意味着我不认为它正在做我认为它正在做的事情......
此外,何时以及如何释放连接?
我想知道滚动自己是否更有利,因为那时我会更熟悉一切,但我真的不想在这种情况下重新发明轮子:).
谢谢你
Bal*_*usC 15
这不是正确的方法.数据源需要由运行应用程序的任何容器管理.MysqlConnectionPoolDataSource
它不是连接池.它只是javax.sql.DataSource
界面的具体实现.您通常在JNDI上下文中定义它并从那里获取它.MySQL本身也在其文档中明确说明了这一点.
现在,如何使用它取决于应用程序的目的.如果它是Web应用程序,那么您需要引用相关servletcontainer/appserver的JNDI资源文档.如果它是例如Tomcat,那么你可以在这里找到它.如果您正在运行客户端应用程序 - 我会高度质疑连接池的价值 - 那么您需要寻找一个连接池框架,它可以利用MySQL提供的连接池数据源,例如C3P0.
您发布的代码的另一个问题是PooledConnection#getConnection()
将返回底层连接,因此不是池连接.在它上面调用close将不会返回到池的连接,但只是关闭它.该池必须每次都创建一个新连接.
然后是线程安全故事,这取决于所讨论的真实连接池框架.C3P0已经证明了它的坚固性在几年,你不只要你写根据标准成语JDBC代码,即用担心它仅在JDBC接口和收购,并关闭所有资源(Connection
,Statement
并ResultSet
在最短的范围内).