在使用具有单个公共连接而没有任何池的PreparedStatement的情况下,我可以为每个具有预准备语句功能的dml/sql操作重新创建一个实例吗?
我的意思是:
for (int i=0; i<1000; i++) {
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setObject(1, someValue);
preparedStatement.executeQuery();
preparedStatement.close();
}
而不是:
PreparedStatement preparedStatement = connection.prepareStatement(sql);
for (int i=0; i<1000; i++) {
preparedStatement.clearParameters();
preparedStatement.setObject(1, someValue);
preparedStatement.executeQuery();
}
preparedStatement.close();
我的问题是,我想把这段代码放到多线程环境中,你能给我一些建议吗?谢谢
发布于 2010-03-18 10:03:51
代码中的循环只是一个过于简单的例子,对吧?
最好只创建一次PreparedStatement
,然后在循环中反复使用它。
在不可能做到这一点的情况下(因为它使程序流过于复杂),使用PreparedStatement
仍然是有益的,即使您只使用一次,因为服务器端的工作(解析SQL和缓存执行计划)仍然会减少。
为了解决您希望重用Java端PreparedStatement
的情况,一些JDBC驱动程序(例如Oracle)有一个缓存特性:如果您在相同的连接上为相同的PreparedStatement
创建一个SQL,那么它将为您提供相同的(缓存的)实例。
关于多线程:我不认为JDBC连接可以跨多个线程共享(即由多个线程并发使用)。每个线程都应该从池中获取自己的连接,使用它,然后再次将它返回到池中。
https://stackoverflow.com/questions/2467125
复制相似问题