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 异常。

您需要再次打开流。