java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] 不能更新;当前正在被机器 '20090804-1122' 上的用户 'admin' 锁定。

这样的错误,真的还是第一次看到,一时摸不到头脑了!不过在Google中搜索一会找到了一篇不错的解决方法!如下:(谢谢本文的作者)

先声明这不是我们编程的错误,因为如果再次(再再次)提交的话就会成功的插入或修改数据的。

问题描述:

在使用JDBC ODBC连接MS Access数据库时,插入Insert或更新Update数据时经常会发生如下错误:

java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] 不能更新;当前正在被机器 'SN0101' 上的用户 'admin' 锁定。

       at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958)

       at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)

       at sun.jdbc.odbc.JdbcOdbc.SQLExecute(JdbcOdbc.java:3150)

       at sun.jdbc.odbc.JdbcOdbcPreparedStatement.execute(JdbcOdbcPreparedStatement.java:214)

       at sun.jdbc.odbc.JdbcOdbcPreparedStatement.executeUpdate(JdbcOdbcPreparedStatement.java:136)

       at com.snsoft.aest.Untitled1.saveDownloadData(Untitled1.java:79)

       at com.snsoft.aest.Untitled1.main(Untitled1.java:28)

问题探索:

www.baidu.comwww.google.com上进行相关问题的检索,没有找到适合的解决方法,发生这个问题的主要原因是由于ODBCAccess的连接在执行一次操作时还没有完全释放时,再次给该连接发起了操作请求造成的。

Java程序通过JDBC ODBC桥的方式来访问Access数据库,该问题就会经常发生(可能和操作系统的某些机制相关,可能换一台计算机就不出现这个问题),原因是,JDBC ODBC桥通过Java的本地接口调用Windows操作系统的ODBC驱动管理器然后由ODBC访问Access数据库,真正实现了桥的功能;然而可能因为桥的两边在某个地方不同步(主要是操作请求),造成一个正在执行中的连接再次收到操作请求。

Google上搜索到一个第三方的AccessJDBC驱动程序:HXTT Access JDBC3.0 参阅:www.hxtt.com 使用这驱动程序没有出现“不能更新;当前正在被机器 'XXX' 上的用户 'admin' 锁定”问题,不过这个JDBC驱动程序需要付费,Free版只允许50个查询(一次),多余50个查询的操作将失败,付费后可去掉限制,但对于我们来说100多欧元的价格太多了。

 

“自己动手、丰衣足食”在经过N次失败后,不断摸索经验,曾试过“ODBC数据源”方式(这个有点儿傻,JDBC ODBC就是调用的Windows的数据源,因此如果是用JDBC ODBC桥的话,建数据源无济于事);换不同的Access驱动(在GoogleBaiDu中查阅最后的答案是Access的三种驱动Microsoft Access Driver (*.mdb)Driver do Microsoft Access (*.mdb)Microsoft Access-Treiber (*.mdb)类似,没有什么差别只是语法问题);最后想到一个方法,延时等ODBC完全完成操作再请求下一次操作,这个方法降低了程序整体速度和数据吞吐量,但基本解决问题。

 

 

经验解决:

 

1)一次Connection连接,尽可能多的执行操作(插入、更新),如果能使用批处理的话,最好使用批处理;

2)释放一个Connection连接后让程序(或循环)暂停100毫秒以上,然后在取得连接执行下一组操作。

 

注:在CPU P4 2.4G 内存1G的环境下测试过,如果硬件环境较差,增大暂停时间,一定要在释放连接后进入暂停状态,让Java程序Sleep一段时间。

 

// 示例代码

//

    public static void main(String[] args) {

        Untitled1 u=new Untitled1();

       

        XmlRecordSetParser parser=new XmlRecordSetParser();

        try {

            for(int i=0;i<100;i++){

                parser.parse(new File("cesdowninfo.xml"));

                XmlRecordSet record = parser.getXmlRecordSet();               

                u.saveDownloadData(record);

                System.out.println(i+1);

                Thread.sleep(100);

            }

            System.out.print("============OK===================");

        }

        catch (Exception ex) {

            ex.printStackTrace();

        }

           

       

    }

   

   

    /**

     *

     * @param record XmlRecordSet

     * @return boolean

     */

    public boolean saveDownloadData(XmlRecordSet record){

        boolean result=false;

        Connection conn=getConnection();

        PreparedStatement stem=null;

        try {

            stem = conn.prepareStatement("insert into SN_CUSTOM_ES_DAT (MD5_VALUE,COLUMN_NAME,COLUMN_ID,INFO_TITLE,INFO_CONTENT,INFO_FROM,CREATE_USER,INFO_TYPE,INFO_ID,IS_LCOCAL) values(?,?,?,?,?,?,?,?,?,?)");

            if(record!=null) {

                while (record.next()) {

                     

                    stem.setString(1,record.getString("md5"));

                    stem.setString(2,record.getString("Cid"));

                    stem.setString(3,record.getString("Column"));

                    stem.setString(4,record.getString("Title"));

                    stem.setString(5,record.getString("Content"));

                    stem.setString(6,record.getString("Form"));

                    stem.setString(7,record.getString("Author"));

                    stem.setInt(8,0);

                    stem.setInt(9,record.getInteger("ID"));

                    stem.setInt(10,0);

                    //result=(stem.executeUpdate()==1); 

                    stem.addBatch();

                }

                stem.executeBatch();

            }

        }

        catch (SQLException ex) {

            ex.printStackTrace();

        }

        finally{

            try {

                if (stem !=null) stem.close();

                if (conn !=null) freeConnection(conn);

            }catch (SQLException ex) {

            }

        }

       

        return result;

    }

 

<think>好的,用户遇到了Java应用程序中初始化MySQL数据源时的错误,具体是java.sql.SQLException: com.mysql.cj.jdbc.Driver。我需要根据提供的引用信息来整理解决方案。首先,这个错误通常和驱动类配置或依赖版本不匹配有关。 根据引用1到4,常见的解决步骤包括检查驱动类名是否正确,更新MySQL连接器版本,配置Maven依赖,以及检查JDBC URL格式。特别是,用户可能使用了旧版本的MySQL连接器,而驱动类名在5.x和8.x版本是不同的。例如,旧版本使用com.mysql.jdbc.Driver,而8.x以上版本需要用com.mysql.cj.jdbc.Driver,但这里错误信息已经显示使用了正确的cj驱动,所以可能问题在于依赖版本或者URL参数。 另外,引用2和3提到需要将连接器版本升级到8.0.x,比如8.0.28,并在pom.xml中正确配置依赖。同时,引用4指出版本不兼容的情况,例如使用8.0.34的MySQL但连接器版本过低。因此,用户需要确保连接器版本与MySQL服务器版本匹配。 还需要检查JDBC URL中的时区设置,如添加serverTimezone=UTC,这在引用3的配置示例中有体现。此外,Maven依赖的刷新和项目的清理重启也是关键步骤,可能解决缓存导致的旧驱动问题。 总结步骤应该是:验证驱动类名,更新依赖版本,检查URL格式,清理项目,并确保版本一致性。同时,用户可能需要检查是否有多个驱动冲突,比如其他依赖引入了旧版本连接器,导致冲突。这种情况下,Maven的依赖排除或明确指定版本可以解决问题。</think>### 解决方案:DataSource初始化错误`java.sql.SQLException: com.mysql.cj.jdbc.Driver` #### 1. 检查驱动类名和JDBC URL配置 - **驱动类名**:MySQL Connector/J **8.x及以上版本**的驱动类名为`com.mysql.cj.jdbc.Driver`,而**5.x版本**为`com.mysql.jdbc.Driver`。如果配置错误会导致初始化失败。 - **JDBC URL格式**: ```java // 8.x版本需添加时区参数 jdbc:mysql://localhost:3306/db_name?useSSL=false&serverTimezone=UTC ``` 若未指定时区(如`serverTimezone=UTC`),可能导致连接异常[^3]。 #### 2. 更新MySQL Connector依赖版本 在`pom.xml`中确保使用与MySQL服务端版本匹配的驱动: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <!-- 8.0.x版本对应MySQL 8.x --> <version>8.0.28</version> </dependency> ``` 若驱动版本(如5.1.17)与MySQL服务端(如8.0.34)不兼容,会直接报错[^4]。 #### 3. 清理Maven依赖并重新编译 - 执行`mvn clean install`清除旧依赖 - 检查IDE(如IntelliJ/Eclipse)的Maven依赖树,确保无版本冲突: ```bash mvn dependency:tree ``` #### 4. 验证数据源配置 - **Druid配置示例**(Spring Boot): ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource ``` 若使用Druid连接池,需确认其版本与MySQL驱动兼容(如Druid 1.1.12 + MySQL 8.0.x)[^4]。 #### 5. 检查Java运行环境 - 确认JRE版本与MySQL Connector兼容(如Java 8+支持MySQL 8.x驱动) --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值