相关疑难解决方法(0)

使用MySQL流式传输大型结果集

我正在开发一个使用大型MySQL表的spring应用程序.当加载大表时,我得到一个OutOfMemoryException,因为驱动程序试图将整个表加载到应用程序内存中.

我试过用

statement.setFetchSize(Integer.MIN_VALUE);
Run Code Online (Sandbox Code Playgroud)

但是我打开的每个ResultSet都会挂起close(); 在线查找我发现这是因为它在关闭ResultSet之前尝试加载任何未读的行,但事实并非如此:

ResultSet existingRecords = getTableData(tablename);
try {
    while (existingRecords.next()) {
        // ...
    }
} finally {
    existingRecords.close(); // this line is hanging, and there was no exception in the try clause
}
Run Code Online (Sandbox Code Playgroud)

挂起也发生在小表(3行)上,如果我不关闭RecordSet(发生在一个方法中)然后connection.close()挂起.


堆栈跟踪挂起:

SocketInputStream.socketRead0(FileDescriptor,byte [],int,int,int)行:不可用[native method]
SocketInputStream.read(byte [],int,int)行:129
ReadAheadInputStream.fill(int)行:113
ReadAheadInputStream. readFromUnderlyingStreamIfNecessary(byte [],int,int)行:160
ReadAheadInputStream.read(byte [],int,int)行:188
MysqlIO.readFully(InputStream,byte [],int,int)行:2428 MysqlIO.reuseAndReadPacket(Buffer ,int)行:2882
MysqlIO.reuseAndReadPacket(Buffer)行:2871
MysqlIO.checkErrorPacket(int)行:3414
MysqlIO.checkErrorPacket()行:910
MysqlIO.nextRow(Field [],int,boolean,int,boolean,boolean, boolean,Buffer)行:1405
RowDataDynamic.nextRecord()行:413
RowDataDynamic.next()行:392 RowDataDynamic.close()行:170
JDBC4ResultSet(ResultSetImpl).realClose(boolean)行:7473 JDBC4ResultSet(ResultSetImpl).close( )line:881 DelegatingResultSet.close()行:152
DelegatingResultSet.close()行:152
DelegatingPreparedStatement(DelegatingStatement).clo se()行:163
(这是我的类)Database.close()行:84

java mysql streaming spring

44
推荐指数
2
解决办法
5万
查看次数

使用JDBC迭代大表的最快方法

我正在尝试创建一个java程序来清理和合并表中的行.该表很大,大约500k行,我目前的解决方案运行速度非常慢.我想做的第一件事就是简单地获取一个表示我表中所有行的对象的内存数组.这是我正在做的事情:

  • 一次选择1000行的增量
  • 使用JDBC在以下SQL查询上获取结果集SELECT*FROM TABLE WHERE ID> 0 AND ID <1000
  • 将结果数据添加到内存数组中
  • 继续查询最多500,000,增量为1000,每次添加结果.

这已经很久了.事实上,它甚至没有超过从1000到2000的第二个增量.查询需要永远完成(虽然当我直接通过MySQL浏览器运行相同的东西时它速度相当快).我已经有一段时间了,因为我直接使用了JDBC.有更快的替代方案吗?

java mysql jdbc

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

在Java中使用结果集的有效方法

我正在运行一个select命令,它返回100万行迭代ResultSet.以下代码需要5分钟才能执行.

是否有更快的迭代结果集的方法?

conn = getDbConnection();
Statement createStatement = conn.createStatement();
ResultSet rs = createStatement.executeQuery("Select * from myTable");
while (rs.next())
{
    //do nothing
}
Run Code Online (Sandbox Code Playgroud)

java中是否有一种方法可以在查看结果集中的所有记录时提高效率.

谢谢

java

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

如何将1亿行加载到内存中

我需要从MySQL数据库加载1亿多行到内存中.我的java程序失败,java.lang.OutOfMemoryError: Java heap space 我的机器中有8GB RAM,而且我的JVM选项中给了-Xmx6144m.

这是我的代码

public List<Record> loadTrainingDataSet() {

    ArrayList<Record> records = new ArrayList<Record>();
    try {
        Statement s = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
        s.executeQuery("SELECT movie_id,customer_id,rating FROM ratings");
        ResultSet rs = s.getResultSet();
        int count = 0;
        while (rs.next()) {
Run Code Online (Sandbox Code Playgroud)

知道如何克服这个问题吗?


UPDATE

我发现了这篇文章,并根据下面的评论更新了我的代码.我似乎能够以相同的-Xmx6144m数量将数据加载到内存中,但这需要很长时间.

这是我的代码.

...
import org.apache.mahout.math.SparseMatrix;
...

@Override
public SparseMatrix loadTrainingDataSet() {
    long t1 = System.currentTimeMillis();
    SparseMatrix ratings = new SparseMatrix(NUM_ROWS,NUM_COLS);
    int REC_START = 0;
    int REC_END = 0;

    try {
        for (int i = 1; i <= …
Run Code Online (Sandbox Code Playgroud)

java sql jdbc out-of-memory

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

标签 统计

java ×4

jdbc ×2

mysql ×2

out-of-memory ×1

spring ×1

sql ×1

streaming ×1