Hi You have set factory="org.apache.tomcat.jdbc.pool.DataSourceFactory". In other words, you do not use (tomcat)DBCP, you are using Tomcat jdbc-pool.
In DBCP, the default of rollbackOnReturn attribute is true. However, in Tomcat jdbc-pool, the default of rollbackOnReturn( and commitOnReturn ) attribute are false. see: http://commons.apache.org/proper/commons-dbcp/configuration.html http://tomcat.apache.org/tomcat-8.5-doc/jdbc-pool.html 2017-10-12 6:21 GMT+09:00 Chris Cheshire <yahoono...@gmail.com>: > Working on a migration from 7 to 8.5, and in it I am now using the > tomcat dbcp, instead of apache commons dbcp. I have found that with no > other changes to the db code (except the factory param for the > resource), it is working fine other than there is an implicit commit > happening when I close a connection, even with autocommit turned off > in mysql config, resource config AND in my code. > > Resource config : > > <Resource name="jdbc/mysql" > auth="Container" > type="javax.sql.DataSource" > driverClassName="com.mysql.jdbc.Driver" > url="jdbc:mysql://localhost:3306/mydb?useUnicode=true& > characterEncoding=utf8&useSSL=false" > factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" > username="" > password="" > maxActive="150" > maxIdle="25" > maxWait="60000" > removeAbandoned="true" > removeAbandonedTimeout="300" > logAbandoned="true" > validationQuery="/* ping */" > testOnBorrow="true" > testWhileIdle="true" > timeBetweenEvictionRunsMillis="600000" > defaultAutoCommit="false" /> > > Only thing changed in that from 7.x to 8.5.x is the factory was > org.apache.commons.dbcp.BasicDataSourceFactory. I am using Connector/J > 5.1.44 (latest version). > > > Getting a connection boils down to this in my code (pieces pulled out > of factories and other classes) > > (Support class in web code) > public static DataSource getDataSource() { > try { > return (DataSource)new > InitialContext().lookup("java:comp/env/" + > ServletContextParameters.getDatabaseResourceName()); > } > catch (NamingException ex) { > throw new RuntimeException("unable to find datasource", ex); > } > } > > > (DAO Factory implementation) > public MySQLDAOFactoryImpl(@NotNull DataSource dataSource) { > this.dataSource = dataSource; > > try { > this.dbConn = this.dataSource.getConnection(); > this.dbConn.setAutoCommit(false); > this.dbConn.setTransactionIsolation(Connection.TRANSACTION_READ_ > COMMITTED); > } > catch (SQLException ex) { > throw new DAOException("unable to get database connection", ex); > } > } > > @Override > public void close() { > try { > if (this.dbConn != null) { > this.dbConn.close(); > } > } > catch (SQLException ex) { > throw new DAOException("error closing database connection", ex); > } > } > > > If I do > > daoFactory = new MySQLDAOFactoryImpl(getDataSource()); > > // update #1 > daoFactory.commit() > > // update #2 > daoFactory.close(); > > then update #2 is being committed. > > If I put in this in the close() method of my DAO Factory > > if (!this.dbConn.getAutoCommit()) { > this.dbConn.rollback(); > } > > before the close() call, then update #2 is correctly not getting committed. > > I looked back through the recent tomcat changelogs, and found a > reference to https://bz.apache.org/bugzilla/show_bug.cgi?id=61425 > under the 8.5.21 release which looks like it might be addressing this > problem. However, when I download the source for 8.5.23, there is no > org.apache.tomcat.jdbc directory so I can't dive in there. > > Anyone else experienced this? Hopefully I am just missing something > obvious. > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org > For additional commands, e-mail: users-h...@tomcat.apache.org > > -- > Keiichi.Fujino > <users-h...@tomcat.apache.org> <users-h...@tomcat.apache.org>