日期:2014-05-20  浏览次数:20692 次

问一个多线程情况下的数据库操作是否需要线程lock的问题
在做一个程序,executorService动态产生多个Runnable线程
每个线程都有可能执行Sqlserver写入操作,现在sqlserver只有一个连接
也就是多个线程公用一个sqlserver连接
这种情况下线程在对sqlserver写入的时候需要先lock,等执行完后再unlock吗?

请各位高手指教,谢谢
------最佳解决方案--------------------
不需要,JDBC的Connection对象本身是线程安全的,在多线程执行任务的时候会将任务放在执行队列里,按照入队顺序执行,不会发生冲突
------其他解决方案--------------------
引用:
不需要,JDBC的Connection对象本身是线程安全的,在多线程执行任务的时候会将任务放在执行队列里,按照入队顺序执行,不会发生冲突

非常感谢!!!
刚接触java,好多都不懂
如果问了些很傻的问题请谅解啊

嗯嗯,现在放心了,嘿嘿
------其他解决方案--------------------
引用:
引用:不需要,JDBC的Connection对象本身是线程安全的,在多线程执行任务的时候会将任务放在执行队列里,按照入队顺序执行,不会发生冲突
非常感谢!!!
刚接触java,好多都不懂
如果问了些很傻的问题请谅解啊

嗯嗯,现在放心了,嘿嘿


自信点,你问的这个问题新手肯定问不出来,坚持学习下去,一定会有收获的
------其他解决方案--------------------
记得结贴哦!
------其他解决方案--------------------
数据库自己也有锁,你的锁保证变量的访问,数据库的锁保证表,Row等的访问。
------其他解决方案--------------------
引用:
记得结贴哦!

大哥再问一个问题

刚查到这个一个资料:

通过 Microsoft SQL Server 2005 JDBC Driver SQLServerConnection 对象进行的通信是同步的,因此可安全地执行在多个线程中共享一个连接的语句。Statement 和 SQLServerResultSet 类不是线程安全的。所有与 SQL Server Database Engine 的通信都在连接级别同步。在 JDBC 中,事务控制(例如提交和回滚)是在连接级别实现的。因此,如果多线程需要独立的事务控制,则它们必须分别创建和操作自己的连接。

这个意思是不是Statement并非线程安全,就是说创建对象如果是在线程内创建的话就没什么问题,但是在线程外创建的Statement对象在线程内使用就会出问题?
------其他解决方案--------------------
这个是我SqlServer类里的一个查询方法

   public static ResultSet execute(String sql) {
       try {
Statement sqlStatement=dbConn.createStatement(); //创建Statement对象
ResultSet rs=sqlStatement.executeQuery(sql); 
return true;
}       
   catch (Exception e) {
           e.printStackTrace();
   return null;
       }

    }



在线程里我直接这样用

MainClass.SqlServer.executeQuery("insert ......");




这样多个线程同时写数据库的时候会不会有问题?