【问题标题】:Sharing database connection across fixed number of threads跨固定数量的线程共享数据库连接
【发布时间】:2014-02-22 12:27:46
【问题描述】:
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();
            } 

    }

如何创建一个线程安全的数据库连接,而不是为每个执行任务的线程初始化一个新连接。我问过类似的问题here,但该解决方案使用了我不想使用的第三方库。有人可以告诉我一个简单的选择吗?

【问题讨论】:

  • 建立将提供连接的类连接并使其成为单例
  • 我不确定如何使用单例在多线程应用程序中创建连接池:(
  • run()方法是否应该接收实例并执行db插入?

标签: java multithreading jdbc thread-safety threadpool


【解决方案1】:

在创建线程池时创建单个连接

ExecutorService pool = Executors.newFixedThreadPool(10);
final Connection c = DriverManager.getConnection(...)

然后将其传递给您创建的每个 ItemDispatcher

new ItemDispatcher(item, c)

让 ItemDispatcher 将其保存在成员变量中。

最后,您可能需要使用同步块来保护对连接的访问​​

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

【讨论】:

  • 我试图从创建工作线程的类中隐藏数据库连接代码
  • 您可以创建第三个类,它是“上下文”并且可以保留池和连接,或者在 ItemDispatcher 中创建一个静态单例,在第一次使用时连接到数据库。上下文方式更简洁,但代码更多。哪个更好取决于您所说的“简单”
猜你喜欢
  • 1970-01-01
  • 2018-01-24
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
相关资源
最近更新 更多