MyBatis 抛出异常 "stream closed"
MyBatis throws exception "stream closed"
我有一个作为 cron 运行的 java 应用程序。它使用 MyBatis。在我的mybatis-config.xml中,我有
<environments default="staging">
<environment id="prod_read">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.10.2:3306/myDB"/>
<property name="username" value="dbuser"/>
<property name="password" value="dbpass"/>
</dataSource>
</environment>
<environment id="prod_write">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.10.1:3306/myDB"/>
<property name="username" value="dbuser"/>
<property name="password" value="dbpass"/>
</dataSource>
</environment>
<environment id="staging">.....
</environments>
因此,我在生产中使用了 2 个数据库 - 一个用于读取从属数据库,一个用于写入主数据库。
在代码中,SqlSessionFactory的初始化是这样的
InputStream rd = this.getClass().getClassLoader()
.getResourceAsStream(mybatisConfigXml);
try {
sessionFactory_read = new SqlSessionFactoryBuilder().build(rd, Main.DB_ENV + "_read");
sessionFactory_write = new SqlSessionFactoryBuilder().build(rd, Main.DB_ENV + "_write");
}catch (final Exception e) {
e.printStackTrace();
}
当此代码运行时,我在 _write 初始化时收到异常消息
org.apache.ibatis.exceptions.PersistenceException:
### Error building SqlSession.
### Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: java.io.IOException: Stream closed
如何解决这个问题?它正在谈论哪个流被关闭?我应该创建 2 个 InputStream (rd1, rd2) 实例并在 2 个 SqlSessionFactory 初始化中使用它们吗?
我已经检查了数据库凭据,它们没问题。
提前致谢。
在这种情况下,您将 mybatis 配置流 xml 传递给 SqlSessionFactoryBuilder
两次。在第一次调用期间,流被完全读取并关闭,因此在第二次调用期间你得到 stream is closed
异常。
您需要再次打开流。
我有一个作为 cron 运行的 java 应用程序。它使用 MyBatis。在我的mybatis-config.xml中,我有
<environments default="staging">
<environment id="prod_read">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.10.2:3306/myDB"/>
<property name="username" value="dbuser"/>
<property name="password" value="dbpass"/>
</dataSource>
</environment>
<environment id="prod_write">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.10.1:3306/myDB"/>
<property name="username" value="dbuser"/>
<property name="password" value="dbpass"/>
</dataSource>
</environment>
<environment id="staging">.....
</environments>
因此,我在生产中使用了 2 个数据库 - 一个用于读取从属数据库,一个用于写入主数据库。
在代码中,SqlSessionFactory的初始化是这样的
InputStream rd = this.getClass().getClassLoader()
.getResourceAsStream(mybatisConfigXml);
try {
sessionFactory_read = new SqlSessionFactoryBuilder().build(rd, Main.DB_ENV + "_read");
sessionFactory_write = new SqlSessionFactoryBuilder().build(rd, Main.DB_ENV + "_write");
}catch (final Exception e) {
e.printStackTrace();
}
当此代码运行时,我在 _write 初始化时收到异常消息
org.apache.ibatis.exceptions.PersistenceException:
### Error building SqlSession.
### Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: java.io.IOException: Stream closed
如何解决这个问题?它正在谈论哪个流被关闭?我应该创建 2 个 InputStream (rd1, rd2) 实例并在 2 个 SqlSessionFactory 初始化中使用它们吗? 我已经检查了数据库凭据,它们没问题。 提前致谢。
在这种情况下,您将 mybatis 配置流 xml 传递给 SqlSessionFactoryBuilder
两次。在第一次调用期间,流被完全读取并关闭,因此在第二次调用期间你得到 stream is closed
异常。
您需要再次打开流。