相关疑难解决方法(0)

带有rewriteBatchedStatements = true的MySQL和JDBC

我一直在这里,这里,这里这里阅读使用的优点rewriteBatchedStatements=true

如果我理解正确的话,rewriteBatchedStatements=trueJDBC会将尽可能多的查询打包到一个网络数据包中,从而降低网络开销.我对吗?

然后我注意到MySQL服务器中定义的值max_allowed_packet可能会导致查询出现问题(查询未在服务器上执行).

所以我的第二个问题是,JDBC是否知道分配给它的值max_allowed_packet,因此使数据包小于定义的值,max_allowed_packet或者是开发人员必须考虑的内容?

如果我理解错了,请告诉我.

java mysql sql jdbc

47
推荐指数
1
解决办法
3万
查看次数

将jdbc操作放在actor中是否很好?

我正在构建一个传统的webapp,它通过JDBC进行数据库CRUD操作.我想知道在当前的请求处理线程中将jdbc操作放入actor是否合适.我做了一些搜索,但没有找到演示这个的教程或示例应用程序.

那么缺点和优点是什么?这个异步化是否会像nio一样提高appserver的容量(即处理的并发请求)?

scala jdbc actor

14
推荐指数
1
解决办法
1432
查看次数

在多线程应用程序Android中访问数据库的最佳方法?

注意:请不要将此问题标记为重复.我已经经历了几个类似的问题,但找不到满意的答案.

我一直在研究使用Sqlite数据库的应用程序.我们遵循单例模式,确保我们只能在整个应用程序中创建一个辅助类实例.

public class CustomSqliteHelper extends SQLiteOpenHelper {

  public static CustomSqliteHelper getInstance(Context context) {
    if (instance == null) {
      synchronized (CustomSqliteHelper.class) {
        if (instance == null) {
          instance = new CustomSqliteHelper(context);
        }
      }
    }
    return instance;
  }
}
Run Code Online (Sandbox Code Playgroud)

但有时应用程序崩溃了SQLiteDatabaseLockedException.我理解当多个线程/进程尝试一次写入数据库时​​会出现此异常.即使一个线程/进程在写操作仍在进行时尝试读取数据库,也会抛出此异常.

所以我一直在阅读很多关于这个以及防止这种情况发生的可能方法.很多帖子建议使用ContentProvider而不是直接扩展SqliteOpenHelper类和对数据库对象执行操作.在阅读其中一篇帖子时,这篇文章提到在使用Content Provider时,您不需要手动处理多线程环境.

虽然ContentProvider缺乏线程安全性,但通常您会发现在防止潜在的竞争条件方面您无需采取进一步行动.规范示例是您的ContentProvider由SQLiteDatabase支持的时间; 当两个线程同时尝试写入数据库时​​,SQLiteDatabase将自行锁定,确保一个等待直到另一个完成.每个线程都将获得对数据源的互斥访问,从而确保满足线程安全性.

以上引用似乎令人困惑,因为首先它提到ContentProvider不支持线程安全.但他总结说,应用程序开发人员不需要做任何事情来实现并发.

另外,如果我选择使用SqliteOpenHelper,那么防止这些崩溃的最佳方法是什么?我一直在考虑为每个db操作使用锁.

 public class CustomSqliteHelper extends SQLiteOpenHelper {

 private String lock = "lock";

 public void insert(){
    synchronized(lock){
       // Do the insert operation here.
    }
 }


 public void update(){
    synchronized(lock){
       // Do …
Run Code Online (Sandbox Code Playgroud)

java sqlite multithreading android

10
推荐指数
1
解决办法
6049
查看次数

停止非循环Java线程

这可能是我误解了我所读到的内容的一个例子,但是用Java杀死一个线程的所有例子似乎都表明你必须发出一个信号来杀死自己; 没有一些严重的风险,你不能从外面杀死它.问题是,所有关于如何"礼貌地"要求线程死亡的例子都有某种循环,所以你要做的就是在每次迭代时都看一个标志.

所以,我得到的是一个线程,它只需要一段时间(一系列SQL查询).我当然可以在每一步之后进行检查,但它们不是在一个循环中,并且我没有一种非常优雅的方式可以解决这个问题.这是我正在做的一个例子:

new Thread(new Runnable(){
    public void run(){
        //query 1
        Connection conn = db.getConnection();
        Statement s = conn.createStatement();
        ResultSet rs = s.executeQuery("SELECT ...");
        while(rs.next()){
            //do stuff
        }

        //query 2
        rs = s.executeQuery("SELECT ...");
        while(rs.next()){
            //do stuff
        }

        //query 3
        rs = s.executeQuery("SELECT ...");
        while(rs.next()){
            //do stuff
        }
    }
}).start();
Run Code Online (Sandbox Code Playgroud)

这是一个例子,我不使用匿名内部类,但它说明我的run()方法不能优雅地停止自己.此外,即使我在每个步骤之后检查,如果特定查询需要很长时间才能运行,则此代码将无法在查询完成之后停止.

这段代码用于GUI应用程序,我真的想找到一种很好的方法来快速杀死一个线程而不使用Thread.stop().

编辑 - yshavit的答案是一个很大的帮助,因为我不知道Statement.cancel()存在.如果你很好奇,我的特定问题的答案是构建一个更抽象的数据库访问类.该类必须创建一个子线程来执行查询并在其运行时循环,检查每次迭代是否当前线程(而不是子线程)被中断.如果它被中断,它只调用Statement.cancel(),子线程将抛出异常并死掉.并非所有JDBC驱动程序都支持Statement.cancel(),但Oracle 11g 支持.

java sql multithreading thread-safety

7
推荐指数
1
解决办法
2128
查看次数

Java异步数据库API

由于使用数据库需要输入/输出,可能会花费无数的时间,等等。因此,想要一个非阻塞的异步API是很自然的。Java是否有一个?

java rdbms asynchronous

5
推荐指数
1
解决办法
3124
查看次数

为什么主要数据库供应商不提供真正的异步API?

我使用Oracle和Mysql,我很难理解为什么没有编写API以便我可以发出呼叫,离开并做其他事情,然后再回来拿起它,例如NIO - 我被迫奉献一个等待数据的线程.似乎SQL接口是唯一仍然强制同步IO的地方,这意味着占用等待数据库的线程.

有人可以解释一下这个原因吗?有什么根本的东西会让这很困难吗?

能够使用1-2个线程来管理我的数据库查询问题和结果获取,而不是使用工作线程来检索数据,这将是很棒的.

我注意到在实现异步API时有两次实验尝试(例如:adbcj),但似乎没有为生产使用做好准备.

database asynchronous

5
推荐指数
1
解决办法
190
查看次数

Java中的非阻塞ODBC调用

我使用非常标准的Java ODBC功能 - Connection从池中获取a ,创建Statement并执行它.

我们的用例是游戏,记录游戏进度 - ODBC调用主要是对存储过程的调用,并且在大多数情况下没有返回值.因此,ODBC调用阻塞的事实很烦人 - 游戏已基于回合,但如果数据库速度慢,用户可以看到更长的暂停时间.

如果我不需要检查ODBC调用的结果,是否有任何内置功能来异步执行语句?如果没有,在没有编写大量代码的情况下,这样做的好方法是什么?如果发生ODBC异常,我仍然需要捕获它们.

这个问题虽然不相同但看起来有意义... 异步jdbc调用是否可行?

java jdbc java-6

1
推荐指数
1
解决办法
1093
查看次数