当前位置: 首页 > 知识库问答 >
问题:

如何向Postgresql CopyManager指示会话实例

罗飞宇
2023-03-14
    null
public boolean loadElectricFishData(Integer fileId, File eventfile, File samplefile) {
    Session session = stagingSessionFactory.getCurrentSession();
    String elecCountTableName = "temp_eb_elec_count_" + fileId;

    return createTable(session, elecCountTableName , "nemostaging.eb_elec_count")
            && copyTableFromCSV(session, elecCountTableName, eventfile) ? true : false;
}

private boolean createTable(Session session, String tableName, String likeTableName) {
    SQLQuery query = session.createSQLQuery("CREATE TABLE nemostaging." + tableName + " (LIKE " + likeTableName + " INCLUDING ALL)");
    query.executeUpdate();
    session.flush();
    session.close();
    return true;
}

private boolean copyTableFromCSV(Session session, final String tableName, final File csv) {
    SessionImpl sessionImpl = (SessionImpl)session;
    Connection connection = sessionImpl.getTransactionCoordinator().getJdbcCoordinator().getLogicalConnection().getConnection();
    FileReader fileReader = null;
    try {
        CopyManager copyManager = new CopyManager((BaseConnection) connection);
        fileReader = new FileReader(csv);
        copyManager.copyIn("COPY nemostaging." + tableName + " FROM STDIN DELIMITER ',' CSV HEADER", fileReader);
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        if (fileReader != null) {
            try {
                fileReader.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    return false;
}

-----更新--2015-11-13----嗨,克雷格林格,我尝试了你的建议,但得到了一个例外:

我的代码:

public boolean loadSpotlightData(final Integer fileId, final File datafile) {
    final String spotCountTableName = "tmp_eb_spot_count_" + fileId;
    Session session = stagingSessionFactory.getCurrentSession();
    SQLQuery query = session.createSQLQuery("CREATE TEMP TABLE " + spotCountTableName + " (LIKE nemostaging.eb_spot_count INCLUDING ALL)");
    query.executeUpdate();
    session.doWork(new Work() {
        @Override
        public void execute(Connection connection) throws SQLException {
            CopyManager copyManager = connection.unwrap(org.postgresql.copy.CopyManager.class);
            FileReader fileReader = null;
            try {
                fileReader = new FileReader(datafile);
                copyManager.copyIn("COPY " + spotCountTableName + " FROM STDIN DELIMITER ',' CSV HEADER", fileReader);
            } catch (SQLException e) {
                LOG.error("Errors occur while COPY nemostaging." + spotCountTableName + " FROM STDIN DELIMITER ',' CSV HEADER;", e);
            } catch (FileNotFoundException e) {
                LOG.error("The CSV file cannot be found while copying into database.", e);
            } catch (IOException e) {
                LOG.error("Errors occur while reading the csv file.", e);
            } finally {
                if (fileReader != null) {
                    try {
                        fileReader.close();
                    } catch (IOException e) {
                        LOG.error("Errors occur while closing file reader.", e);
                    }
                }
            }
        }
    });

    Query query1 = session.getNamedQuery("staging.loadSpotlightData");
    query1.setParameter("fileId", fileId);
    query1.list();

    return true;
}

共有1个答案

翁硕
2023-03-14

您必须做的是运行Hibernate查询,然后要求Hibernatesession获取实现org.postgresql.pgconnection的基础connection对象并使用它。

您过去可以使用session.connection()方法解包会话,但现在不推荐使用这种方法。而是使用DoWorkAPI。您传递的java.sql.connection也可能被您的连接池包装,因此您可能必须将其解包才能获得实际的连接对象。如果您正在使用JDBC4驱动程序和池(您应该使用),只需使用connection实现的wrapter接口unwrap(...)方法,例如unwrap.org.postgresql.copy.copyManager.class)

类似于(未经测试):

session.doWork(
    new Work() {
        public void execute(Connection connection) throws SQLException 
        { 
            CopyManager cm = connection.unwrap(org.postgresql.copy.CopyManager.class);
            ... do stuff ...
        }
    }
);
 类似资料:
  • 尽管我意识到这不是“好”的做法--我有一个用例,我需要将Selenium驱动程序指向(连接)我的默认Chrome会话/配置文件。 如何将selenium连接到默认Chrome会话?这与通常打开Chrome时看到的会话相同。 我已经看过另一个问题,但是这里的答案没有解决如何将Selenium指向默认会话的问题。而且--这是一个过时的问题--从那以后,Chrome和Chromedriver有了很大的进

  • “会话”接口有两个方法,在Scala中,由于类型擦除,它们被简化为具有相同的签名: 试图实现它们会产生错误: 错误:双重定义:第199行的方法createstoredprocedurecall:(procedureName: String,resultset mappings:string *)org . hibernate . procedure . procedure call和方法creat

  • 我正在尝试使用AMQP QPID java库向服务总线发送消息 我得到这个错误: “需要为支持排序的分区主题的所有代理消息设置SessionId” 我的主题已打开强制消息排序(这是我得到这个错误的方式我猜) 使用Azure Service bus java库(而不是AMQP)时,我有以下功能: 这实体设置会话ID(…); 使用AMQP库时,我看不到在要发送的消息上设置会话ID的选项 请注意,如果取

  • 问题内容: 我刚刚在Google AppEngine / Java + GWT应用程序中启用了Session。以及如何使用它?我如何获得会话ID并从中播放所有好东西?是否有任何简单的登录页面的真实示例,我只是输入LoginName和Password,然后通过RPC调用转到服务器,针对数据库进行身份验证并将Session ID发送回客户端。 我已经有以下代码,但不知道下一步该怎么做: GWT登录表单

  • 在发布这个问题之前,我谷歌了很多这个问题,并且在网络Socket@ServerEndpoint中从HttpServletRequest访问Http会话是我能找到的最好的问题/答案之一,但它似乎不能解决我的问题。 我可以通过这种方式从websocket访问HttpSession,但是我无法访问与普通HTTP请求相同的CDI会话bean实例。 我也尝试在会话中存储Weld实例,并尝试在WebSocke

  • 问题内容: 我刚刚有了Hibernate Session和Connection之间的关系。但是现在,我又遇到一个问题:hibernate会话工厂如何管理会话?在以下代码段中:DAO类的save()方法: 当我们调用时,它将创建一个新会话(通过ThreadLocal附加到当前线程),该会话也附加到JDBC连接。但是,正如您所看到的,我们不需要关闭该会话(会话。 close()),都没有连接。那么,H