2014-01-30 47 views
0
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,但该解决方案使用了第三方库,我不打算使用它。有人能告诉我一个简单的选择吗?跨固定数量的线程共享数据库连接

+1

使课堂连接将提供连接,使其单 – Kick

+0

我不知道如何创建连接池在多线程应用程序中使用单例:( – MooHa

+0

请按照此链接http://www.coderanch.com/t/588099/java/java/access-Singleton-connection-database – Kick

回答

0

当你创建你的线程池创建一个连接

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

然后将它传递给每个ItemDispatcher创建

new ItemDispatcher(item, c) 

有ItemDispatcher保持在一个成员变量。

最后你可能需要保护访问连接与synchronized块

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

我试图隐藏创建工作线程的类的db连接代码 – MooHa

+0

您可以创建第三类w hich是“上下文”,可以保存池和连接,或者在ItemDispatcher中创建静态单例,并在首次使用时连接到数据库。上下文的方式更清晰,但代码更多。哪个更好取决于你所说的“简单” –