Java 在线程中创建并使用JDBC语句的最佳设计

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

我在一个应用程序中工作,在这个应用程序中,需要在足够长的时间内将大量不同类型的数据填充到DB2表中。所以我在代码中做了一些更改,以在不同的线程中填充数据,如下所示

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)
        {
        }
    }