单个数据库连接未按任务初始化

时间:2014-01-29 10:39:09

标签: java multithreading concurrency prepared-statement

public class Parser {

    ExecutorService pool = Executors.newFixedThreadPool(10);

    public void update() {

        Item item = new Item(subj.getName(), dateBuilder.toString(),
                cobBuilder.toString(), interest, count);

        pool.submit(new ItemDispatcher(item));
    }



} 



public class ItemDispatcher implements Runnable {

    private Item item;

    public ItemDispatcher(Item someItem) {

        this.item = someItem;

    }


    @Override
    public void run() {

        try {
            new Database(item).writeToDb();
        } catch (SQLException e) {
            e.printStackTrace(); 

        }

    }

}


public class Database {

    private String name;
    private String date;
    private String cob;
    private String interest;
    private String count;

    private String _url;
    private String _userId;
    private String _password;
    private String _dbLib;
    private String _dbFile;
    private Connection _conn;
    private PreparedStatement _statement;

    public Database(Item item) {

        name = item.get_item();
        date = item.get_date();
        cob = item.get_cob();
        interest = item.get_interest();
        count = item.get_count();
    }


    public void writeToDb() {

        try {

            //statment.setString(); 
        }

        } catch (SQLException e) {
            e.printStackTrace();
        } 

}

我在包中有三个不同的类:ParserItemDispatcherDatabase。我正在使用一个重用固定数量的线程的线程池(10)。我在课程update()中收到了回调Parser方法的更新。随着更新的到来,我创建了Item对象,这些对象提交为可执行的可运行任务。从ItemDispatcher开始,我将item传递给Database课程。我意识到存在问题。我需要Database类来连接数据库,但是当Threads为每个项目调用Database constructo r时,我不想每次都创建连接,而是使用一个初始化的连接,而不是再次连接。不知道如何做到这一点,有人可以提出一些想法和建议吗?我不希望解析器类知道Database类。我在哪里可以添加连接和preparedStatement代码?

1 个答案:

答案 0 :(得分:0)

创建单例DAO(数据访问对象)类,并让此类初始化池。如果您对这两个术语都不确定,请询问,我会为您找到一些代码。

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class ItemDAO {

    private static ItemDAO dao;
    private Connection conn;
    private PreparedStatement prepStat;
    private static final String SQL_INSERT_ITEM = "INSERT INTO tbl_item SET id=?`, name = ?, count = ?;";

    private ItemDAO() {
        conn = null; /* put initialization code for the connection here */
        try {
            prepStat = conn.prepareStatement(SQL_INSERT_ITEM); // prepare a statement
        } catch (SQLException e) {
            // What do you want to do if it fails?
            e.printStackTrace();
        }
    }

    public static ItemDAO getInstance() {
        if (dao == null)
            dao = new ItemDAO();
        return dao;
    }

    public void writeItemToDB(Item item) throws SQLException {
        prepStat.setInt(1, item.getId());
        prepStat.executeUpdate();
    }
}

此代码不是线程安全的,但它将在每个线程中使用相同的连接。如果您需要线程安全(您这样做),您可以使用ConnectionPool为您提供线程安全性并将线程数设置为1.“BoneCP”是众所周知的连接池的名称。