相关疑难解决方法(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万
查看次数

跨多线程解决方案的单一事务

据我了解,所有事务都是线程绑定的(即上下文存储在ThreadLocal中).例如,如果:

  1. 我在事务父方法中启动事务
  2. 使数据库在异步调用中插入#1
  3. 使数据库在另一个异步调用中插入#2

然后,即使它们共享相同的"事务性"父级,也会产生两个不同的事务(每个插入一个).

例如,假设我执行两次插入(并使用非常简单的示例,即为了简洁起见,不使用执行程序或可完成的未来等):

@Transactional
public void addInTransactionWithAnnotation() {
    addNewRow();
    addNewRow();
}
Run Code Online (Sandbox Code Playgroud)

将根据需要执行两个插入作为同一事务的一部分.

但是,如果我想并行化这些插入的性能:

@Transactional
public void addInTransactionWithAnnotation() {
    new Thread(this::addNewRow).start();
    new Thread(this::addNewRow).start();
}
Run Code Online (Sandbox Code Playgroud)

然后,这些生成的线程中的每一个都不会参与事务,因为事务是线程绑定的.

关键问题:有没有办法将事务安全地传播到子线程?

我想到的解决这个问题的唯一解决方案:

  1. 使用JTA或某些XA管理器,根据定义应该能够执行此操作.但是,我理想情况下不希望将XA用于我的解决方案,因为它的开销很大
  2. 将我想要执行的所有事务工作(在上面的示例中,addNewRow()函数)传递给单个线程,并以多线程方式执行所有先前的工作.
  3. 找出在Transaction状态上利用InheritableThreadLocal并将其传播到子线程的某种方法.我不知道该怎么做.

有没有更多可能的解决方案?即使它的味道有点像解决方法(比如上面的解决方案)?

java concurrency multithreading transactions

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

解析查询意味着什么?

大多数关系数据库分四步处理JDBC/SQL查询:

  1. 解析传入的SQL查询
  2. 编译SQL查询
  3. 规划/优化数据采集路径
  4. 执行优化的查询/获取并返回数据

我想知道"解析传入的查询"到底意味着什么?"计划/优化数据采集路径"是什么意思?

sql parsing query-parser

8
推荐指数
1
解决办法
4万
查看次数

优化oracle jdbc批量插入

我需要使用JDBC将大量插入(即两位数百万)插入Oracle-DB.为此,我使用类似下面的类,灵感来自使用JDBC进行批量INSERTS高效方法:

public class Inserter {
    private final int batchSize;
    private final Connection con; // with .setAutoCommit(false)
    private final PreparedStatement ps;
    private int currentSize = 0;

    public Inserter(Connection con, PreparedStatement ps, int batchSize) {
        this.con = con;
        this.ps = ps;
        this.batchSize = batchSize;
    }

    public void addInsert(Object[] vals) throws SQLException {
        ps.clearParameters(); // should be redundant, but better safe than sorry
        for (int i = 0; i < val.length; i++) {
            this.ps.setObject(i + 1, vals[i]);
        }
        ps.addBatch(); …
Run Code Online (Sandbox Code Playgroud)

java oracle jdbc

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

Java8 Stream batch processing to avoid OutOfMemory

I'm having something like:

    List<Data> dataList = stepts.stream()
        .flatMap(step -> step.getPartialDataList().stream())
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

So I'm combining into dataList multiple lists from every step.

My problem is that dataList might run into OutOfMemoryError. Any suggestions on how I can batch the dataList and save the batches into db?

My primitive idea is to:

    for (Step step : steps) {
        List<Data> partialDataList = step.getPartialDataList();

        if (dataList.size() + partialDataList.size() <= MAXIMUM_SIZE) {
            dataList.addAll(partialDataList);
        } else {
            saveIntoDb(dataList);
            dataList = new ArrayList<>();
        }
    } …
Run Code Online (Sandbox Code Playgroud)

java mysql hibernate java-8 java-stream

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

优化数据库插入java

我对 java 和数据库比较陌生,因此请您帮助我进行代码优化。我有大约 20 个带有逗号分隔值的文本文件。每个文本文件有大约 10000 行基于每行中的第三个值,我将数据插入到不同的表中。每次我检查第三个值并使用不同的方法来保存这些数据。我的代码如下。有人可以告诉我这是否是执行此操作的正确方法。提前致谢。

public  void readSave() throws SQLException
{
    File dir = new File("C:\\Users\\log");
    String url = Config.DB_URL;
    String user= Config.DB_USERNAME;
    String password= Config.DB_PASSWORD;
    con= DriverManager.getConnection(url, user, password);
    con.setAutoCommit(false);
    String currentLine;
    if (!dir.isDirectory())
        throw new IllegalStateException();
    for (File file : dir.listFiles()) {
        BufferedReader br;
        try {
            br = new BufferedReader(new FileReader(file));
            while ((currentLine = br.readLine()) != null) {
                List<String> values = Arrays.asList(currentLine.split(","));
                if (values.get(2).contentEquals("0051")) 
                    save0051(values,con);
                else if(values.get(2).contentEquals("0049"))
                    save0049(values,con);
                else if(values.get(2).contentEquals("0021"))
                    save0021(values,con);
                else if(values.get(2).contentEquals("0089"))
                    save0089(values,con);
                if(statement!=null)
                    statement.executeBatch(); …
Run Code Online (Sandbox Code Playgroud)

java database

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