Hi MyBatis Team,
I'm getting the below exception:
Exception in thread "main"
org.apache.ibatis.exceptions.PersistenceException:
### Error opening session. Cause:
org.apache.ibatis.transaction.TransactionException: Error configuring
AutoCommit. Your driver may not support getAutoCommit() or
setAutoCommit(). Requested setting: false. Cause:
java.sql.SQLException: Closed Connection
### Cause: org.apache.ibatis.transaction.TransactionException: Error
configuring AutoCommit. Your driver may not support getAutoCommit()
or setAutoCommit(). Requested setting: false. Cause:
java.sql.SQLException: Closed Connection
at
org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:
8)
at
org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource(DefaultSqlSessionFactory.java:
83)
at
org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSession(DefaultSqlSessionFactory.java:
32)
at
org.apache.ibatis.session.SqlSessionManager.openSession(SqlSessionManager.java:
98)
at org.apache.ibatis.session.SqlSessionManager
$SqlSessionInterceptor.invoke(SqlSessionManager.java:267)
at $Proxy16.insert(Unknown Source)
at
org.apache.ibatis.session.SqlSessionManager.insert(SqlSessionManager.java:
182)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:
59)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:25)
at $Proxy27.insert(Unknown Source)
at
com.metricstream.itgrc.ucf.service.AssetsList.processBasicInforType(AssetsList.java:
101)
at
com.metricstream.itgrc.ucf.service.AssetsList.processAssetItemType(AssetsList.java:
50)
at com.metricstream.itgrc.ucf.service.AssetsList.load(AssetsList.java:
35)
at
com.metricstream.itgrc.ucf.service.AssetLoader.process(AssetLoader.java:
24)
at
com.metricstream.itgrc.ucf.service.AssetLoader.main(AssetLoader.java:
31)
Caused by: org.apache.ibatis.transaction.TransactionException: Error
configuring AutoCommit. Your driver may not support getAutoCommit()
or setAutoCommit(). Requested setting: false. Cause:
java.sql.SQLException: Closed Connection
at
org.apache.ibatis.transaction.jdbc.JdbcTransaction.setDesiredAutoCommit(JdbcTransaction.java:
51)
at
org.apache.ibatis.transaction.jdbc.JdbcTransaction.<init>(JdbcTransaction.java:
19)
at
org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory.newTransaction(JdbcTransactionFactory.java:
15)
at
org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource(DefaultSqlSessionFactory.java:
78)
... 13 more
Caused by: java.sql.SQLException: Closed Connection
at
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:
112)
at
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:
146)
at
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:
208)
at
oracle.jdbc.driver.PhysicalConnection.setAutoCommit(PhysicalConnection.java:
1057)
at
org.apache.ibatis.transaction.jdbc.JdbcTransaction.setDesiredAutoCommit(JdbcTransaction.java:
46)
... 16 more
DataSourceProvider Code:
package com.metricstream.itgrc.core.service;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.name.Named;
public class ItgrcDataSourceProvider implements Provider<DataSource> {
private final DataSource dataSource;
public ItgrcDataSourceProvider() {
dataSource = new ItgrcDataSource();
}
@Inject(optional = true)
public void setLoginTimeout(@Named("JDBC.loginTimeout") final int
loginTimeout) {
try {
this.dataSource.setLoginTimeout(loginTimeout);
} catch (SQLException e) {
throw new RuntimeException("Impossible to set login
timeout '" + loginTimeout + "' to Unpooled Data Source", e);
}
}
@Inject(optional = true)
public void setAutoCommit(@Named("JDBC.autoCommit=false") final
boolean autoCommit) {
setAutoCommit(autoCommit);
}
@Override
public DataSource get() {
return dataSource;
}
}
DataSource Code:
package com.metricstream.itgrc.core.service;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.metricstream.itgrc.logger.AppLog;
public class ItgrcDataSource implements DataSource {
private Connection con = null;
private static final String CLASS_ID =
ItgrcDataSource.class.getName();
@Override
public PrintWriter getLogWriter() throws SQLException {
return null;
}
@Override
public void setLogWriter(PrintWriter out) throws SQLException {
}
@Override
public void setLoginTimeout(int seconds) throws SQLException {
}
@Override
public int getLoginTimeout() throws SQLException {
return 0;
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
return null;
}
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
return false;
}
@Override
public Connection getConnection() throws SQLException {
synchronized (this) {
if (con == null) {
try {
String driverName =
"oracle.jdbc.driver.OracleDriver";
Class.forName(driverName);
String serverName = "
server.metricstream.com";
String portNumber = "1521";
String sid = "dev11g";
String url = "jdbc:oracle:thin:@" + serverName +
":" + portNumber + ":" + sid;
String username = "user";
String password = "password";
con = DriverManager.getConnection(url, username,
password);
con.setAutoCommit(true);
} catch (SQLException e) {
AppLog.log(CLASS_ID, "SQLException", e);
throw e;
} catch (ClassNotFoundException e) {
AppLog.log(CLASS_ID, "ClassNotFoundException", e);
}
}
}
return con;
}
@Override
public Connection getConnection(String username, String password)
throws SQLException {
return null;
}
}
MyBatisModule Code:
package com.metricstream.itgrc.ucf.guice.modules;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.mybatis.guice.MyBatisModule;
import com.metricstream.itgrc.core.service.ItgrcDataSourceProvider;
public class UcfMybatisModule extends MyBatisModule {
@Override
protected void initialize() {
environmentId("development");
bindTransactionFactoryType(JdbcTransactionFactory.class);
bindDataSourceProviderType(ItgrcDataSourceProvider.class);
addMapperClasses("com.metricstream.itgrc.ucf.abator.dao");
}
}
PropertyModule Code:
package com.metricstream.itgrc.ucf.guice.modules;
import java.util.Properties;
import com.google.inject.Binder;
import com.google.inject.Module;
import com.google.inject.name.Names;
public class UcfPropertyModule implements Module {
@Override
public void configure(Binder arg0) {
Names.bindProperties(arg0, createTestProperties());
}
static Properties createTestProperties() {
final Properties myBatisProperties = new Properties();
myBatisProperties.setProperty("JDBC.autoCommit", "false");
myBatisProperties.setProperty("poolPingQuery", "select 1 from
dual");
myBatisProperties.setProperty("poolPingEnabled", "true");
return myBatisProperties;
}
}
Main Method:
package com.metricstream.itgrc.ucf.service;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.metricstream.itgrc.core.exceptions.AppException;
import com.metricstream.itgrc.core.service.IParser;
import com.metricstream.itgrc.ucf.annotation.AssetParser;
import com.metricstream.itgrc.ucf.domain.assets.UCFAssetsList;
import com.metricstream.itgrc.ucf.utils.UcfSession;
public class AssetLoader {
@Inject
@AssetParser
private IParser parser;
public void process(InputStream xmlStream) throws AppException {
UCFAssetsList ucfAssetsList = (UCFAssetsList)
parser.parse(xmlStream);
Injector injector = UcfSession.getInjector();
AssetsList assetsList =
injector.getInstance(AssetsList.class);
assetsList.load(ucfAssetsList);
}
public static void main(String args[]) throws
FileNotFoundException, AppException {
Injector injector = UcfSession.getInjector();
AssetLoader assetLoader =
injector.getInstance(AssetLoader.class);
FileInputStream xmlStream = new
FileInputStream("UCF_Assets_List.xml");
assetLoader.process(xmlStream);
}
}
POM File:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.0.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-guice</artifactId>
<version>3.2</version>
</dependency>
<dependency>
<groupId>com.google.code.guice</groupId>
<artifactId>guice</artifactId>
<version>3.0</version>
</dependency>
When I use only MyBatis, the code works. When I club it with Guice,
I'm getting the above said exception. Please let me know if I'm
missing anything in the property settings.
Thanks,
GP.