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;
}
您必须做的是运行Hibernate查询,然后要求Hibernatesession
获取实现org.postgresql.pgconnection
的基础connection
对象并使用它。
您过去可以使用session.connection()
方法解包会话,但现在不推荐使用这种方法。而是使用DoWork
API。您传递的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