Java 在线程中创建并使用JDBC语句的最佳设计
我在一个应用程序中工作,在这个应用程序中,需要在足够长的时间内将大量不同类型的数据填充到DB2表中。所以我在代码中做了一些更改,以在不同的线程中填充数据,如下所示Java 在线程中创建并使用JDBC语句的最佳设计,java,multithreading,jdbc,db2,Java,Multithreading,Jdbc,Db2,我在一个应用程序中工作,在这个应用程序中,需要在足够长的时间内将大量不同类型的数据填充到DB2表中。所以我在代码中做了一些更改,以在不同的线程中填充数据,如下所示 public class ThreadPopulator implements Runnable { volatile private boolean isTaskCompleted; volatile private Connection db2Conn; volatile private List<D
public class ThreadPopulator implements Runnable
{
volatile private boolean isTaskCompleted;
volatile private Connection db2Conn;
volatile private List<Data> list;
volatile private String srcLib;
public ThreadPopulator(Connection db2Conn, List<Data> list, String srcLib)
{
this.db2Conn = db2Conn;
this.list = list;
this.srcLib = srcLib;
}
public void run()
{
try
{
isTaskCompleted = false;
execute(srcLib, list);
}
catch (Throwable e)
{
}
}
synchronized private void execute(String srcLib, List<Data> list)
{
PreparedStatement stmt = null;
int len = list.size();
for (int i = 0; i < len; i++)
{
try
{
if (stmt == null)
stmt =
db2Conn.prepareStatement("INSERT INTO DATA VALUES(?, ?, ?, ?)",
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE,
ResultSet.HOLD_CURSORS_OVER_COMMIT);
Data data = list.get(i);
stmt.setString(1, srcLib);
stmt.setString(2, "VV");
stmt.setDouble(3, data.getSeq());
stmt.setInt(4, data.getDate());
stmt.addBatch();
if ((i + 1) % 5000 == 0)
stmt.executeBatch(); // Execute every 5000 items.
}
catch (Exception e)
{
}
}
try
{
if (len > 0)
stmt.executeBatch(); //for remaining records
}
catch (Exception e)
{
}
finally
{
stmt.close();
if (list != null) list.clear();
isTaskCompleted = true;
}
}
public static ThreadPopulator insert(Connection db2Conn, ArrayList<Data> list, String srcLib)
{
ThreadPopulator populator = new ThreadPopulator(db2Conn, srcLib);
Thread thread = new Thread(populator);
thread.start();
return populator;
}
}
现在一切正常。但是作为一名Java开发人员,我对这种技术并不满意。i、 e.创建一个静态变量,然后在所有线程中使用该对象。
你能告诉我什么样的设计是最好的吗
在threading中创建/使用该语句,它也适用于我的案例
嗯
提前感谢。在这些情况下,通常的做法是使用一些;数据库驱动程序需要实现此功能。您可以在IBM找到有关DB2实现的信息。是的,您指出了正确的事情,但是您可以查看代码,为什么不执行close()以减少打开语句的nbr吗?不,我不太确定。您能否显示您在何处以及如何添加日志记录语句?例如,您可能将日志放在了错误的位置。你也不应该像你在这里一样盲目地捕捉和丢弃
异常
s和可丢弃的
s。这段代码中可能发生任何事情,你永远都不会知道。
private static PreparedStatement stmt = null;
public static void createStatement(Connection db2Conn)
{
try
{
if (stmt == null)
{
stmt =
db2Conn.prepareStatement("INSERT INTO DATA VALUES(?, ?, ?, ?)",
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE,
ResultSet.HOLD_CURSORS_OVER_COMMIT);
}
}
catch (Exception e)
{
}
}