Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在oracle11g中使用dbUtils获取CLOB列?_Java_Xml_Database_Oracle11g_Clob - Fatal编程技术网

Java 如何在oracle11g中使用dbUtils获取CLOB列?

Java 如何在oracle11g中使用dbUtils获取CLOB列?,java,xml,database,oracle11g,clob,Java,Xml,Database,Oracle11g,Clob,我可以从数据库中获取CLOB值,但如果值大于32k,则会出现错误: java.sql.SQLRecoverableException: Closed Connection         at oracle.sql.CLOB.getDBAccess(CLOB.java:1510)         at oracle.sql.CLOB.getSubString(CLOB.java:317) 代码: List<Map<String, Object>> resultListM

我可以从数据库中获取CLOB值,但如果值大于32k,则会出现错误:

java.sql.SQLRecoverableException: Closed Connection
        at oracle.sql.CLOB.getDBAccess(CLOB.java:1510)
        at oracle.sql.CLOB.getSubString(CLOB.java:317)
代码:

List<Map<String, Object>> resultListMap = null;
try {
                    
    new DbUtilsBeanListHandlerImpl();
    DbUtils.loadDriver(driver);
    Properties connectionProperties = new Properties();
    connectionProperties.put("user", userName);
    connectionProperties.put("password", password);
    conn = DriverManager.getConnection(url, connectionProperties);
    QueryRunner query = new QueryRunner();
          resultListMap = query.query(conn, dbQuery,  new MapListHandler());              

} catch (SQLException se) {
    logger.error("SQLException to connect Database "+se.getMessage(), se);
} finally {
    DbUtils.closeQuietly(conn);
}
List resultListMap=null;
试一试{
                    
新的DbUtilsBeanListHandlerImpl();
DbUtils.loadDriver(驱动程序);
Properties connectionProperties=新属性();
connectionProperties.put(“用户”,用户名);
connectionProperties.put(“密码”,password);
conn=DriverManager.getConnection(url,connectionProperties);
QueryRunner query=新的QueryRunner();
resultListMap=query.query(conn,dbQuery,new-MapListHandler())
}捕获(SQLSE异常){
logger.error(“连接数据库的SQLException”+se.getMessage(),se);
}最后{
DbUtils.安静地关闭(康涅狄格州);
}

如何使用dbUtils获取超过32k的CLOB对象?

问题不是Apache Commons dbUtils的问题,而是涉及CLOB的一般问题

通常,当执行返回CLOB值的查询时,JDBC驱动程序在获取行时只加载部分CLOB值。在您的例子中,它似乎可以获取大约32K个字符。对于较小的CLOB值,这将节省到数据库获取值的往返时间。但是,如果该值较大,则驱动程序将不会获取整个值,并且您需要对数据库进行后续调用以获取CLOB的其余部分

在您的例子中,这似乎是在您提供的上述代码运行之后发生的。此时,数据库连接已关闭,因此读取其余CLOB数据为时已晚,因此您会得到一个关于关闭连接的异常

改变这种情况的一种方法是替换DbUtils使用的默认行处理器。以下版本预取CLOB值并将其存储为字符串。根据,对CLOB值调用
ResultSet.getString()
就足以获取整个值:

import java.sql.Clob;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.dbutils.BasicRowProcessor;

public class ClobAwareRowProcessor extends BasicRowProcessor {

    @Override
    public Map<String, Object> toMap(ResultSet resultSet) throws SQLException {
        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
        int columnCount = resultSetMetaData.getColumnCount();

        Map<String, Object> map = new HashMap<>();

        for (int index = 1; index <= columnCount; ++index) {
            String columnName = resultSetMetaData.getColumnName(index);
            Object object = resultSet.getObject(index);
            if (object instanceof Clob) {
                object = resultSet.getString(index);
            }

            map.put(columnName, object);
        }

        return map;
    }
}
导入java.sql.Clob;
导入java.sql.ResultSet;
导入java.sql.ResultSetMetaData;
导入java.sql.SQLException;
导入java.util.HashMap;
导入java.util.Map;
导入org.apache.commons.dbutils.BasicRowProcessor;
公共类ClobAwareRowProcessor扩展了BasicRowProcessor{
@凌驾
公共映射toMap(ResultSet ResultSet)引发SQLException{
ResultSetMetaData ResultSetMetaData=resultSet.getMetaData();
int columnCount=resultSetMetaData.getColumnCount();
Map Map=newhashmap();

对于(int index=1;index来说,问题并不是Apache Commons DbUtils的问题,而是涉及CLOB的一般问题

通常,当执行返回CLOB值的查询时,JDBC驱动程序在获取行时只加载部分CLOB值。在您的情况下,它似乎会获取大约32K个字符。对于较小的CLOB值,这将节省到数据库获取值的往返时间。但是,如果值较大,驱动程序将不会获取whole值,然后需要对数据库进行后续调用以获取CLOB的其余部分

在您的例子中,这似乎是在您提供的上述代码运行之后发生的。此时,数据库连接已关闭,因此读取其余CLOB数据为时已晚,因此您会收到一个关于关闭连接的异常

改变这一点的一种方法是替换DbUtils使用的默认行处理器。以下版本预取CLOB值并将其存储为字符串。根据,对CLOB值调用
ResultSet.getString()
就足以获取整个值:

import java.sql.Clob;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.dbutils.BasicRowProcessor;

public class ClobAwareRowProcessor extends BasicRowProcessor {

    @Override
    public Map<String, Object> toMap(ResultSet resultSet) throws SQLException {
        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
        int columnCount = resultSetMetaData.getColumnCount();

        Map<String, Object> map = new HashMap<>();

        for (int index = 1; index <= columnCount; ++index) {
            String columnName = resultSetMetaData.getColumnName(index);
            Object object = resultSet.getObject(index);
            if (object instanceof Clob) {
                object = resultSet.getString(index);
            }

            map.put(columnName, object);
        }

        return map;
    }
}
导入java.sql.Clob;
导入java.sql.ResultSet;
导入java.sql.ResultSetMetaData;
导入java.sql.SQLException;
导入java.util.HashMap;
导入java.util.Map;
导入org.apache.commons.dbutils.BasicRowProcessor;
公共类ClobAwareRowProcessor扩展了BasicRowProcessor{
@凌驾
公共映射toMap(ResultSet ResultSet)引发SQLException{
ResultSetMetaData ResultSetMetaData=resultSet.getMetaData();
int columnCount=resultSetMetaData.getColumnCount();
Map Map=newhashmap();

对于(int index=1;index)完美解决方案,我可以获取大XML文件,可以获取直接字符串对象而不是CLOB。非常感谢Luke Woodward。完美解决方案,我可以获取大XML文件,可以获取直接字符串对象而不是CLOB。非常感谢Luke Woodward。