在Docker容器中运行时,JDBC进程似乎停止

我有一个简单的Javatesting应用程序与Apache的驼峰2.17.0实施

<camelContext id="txn-route-context" xmlns="http://camel.apache.org/schema/spring"> <route id="partnerToDB-route"> <from uri="jms001:queue:camelInAction.sample.partners?username=admin&password=" /> <transacted /> <bean ref="partner" method="toSql" /> <to uri="jdbc:testoracledb001" /> <log message="Finished running SQL...wait for program exit..."></log> </route> </camelContext> 

路由从jms队列读取消息,使用“partner”bean“toSQL”方法构造插入SQL语句,然后调用JDBC端点通过JDBC运行插入语句,写入日志消息,然后退出。

这个Java程序运行没有问题,如果我将它打包为一个可运行的jar,并使用“java -jar …”直接运行它

然后我将可运行的jar打包到一个高山的java docker镜像中,然后在docker容器中运行它。 请注意,我在运行Docker-Machine的Win7 PC上

 docker build -t "alpine:Java8" . docker run alpine:Java8 java -jar /jdbctest/jdbctest.jar 

第一个docker运行是好的…但是如果我多次重复相同的docker运行命令,那么这个进程就有可能停留在JDBC端点直到超时。

 20160401 10:00:49,752[camelInAction.sample.partners]] EndpointMessageListener WARN Execution of JMS message listener failed. Caused by: [org.apache.camel.RuntimeCamelException - java.sql.SQLRecoverableException: No more data to read from socket] org.apache.camel.RuntimeCamelException: java.sql.SQLRecoverableException: No more data to read from socket at org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:1680) at org.apache.camel.spring.spi.TransactionErrorHandler$1.doInTransactionWithoutResult(TransactionErrorHandler.java:190) at org.springframework.transaction.support.TransactionCallbackWithoutResult.doInTransaction(TransactionCallbackWithoutResult.java:34) at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133) at org.apache.camel.spring.spi.TransactionErrorHandler.doInTransactionTemplate(TransactionErrorHandler.java:176) 

当问题发生一次,如果我再次执行docker运行是可重复的。 如果我删除docker图像,重build图像,并执行docker运行,程序将恢复正常,直到我运行多次。

我看不到任何进一步的日志或错误进行调查…想寻求进一步调查的任何意见

补充一些Dockerfile内容

 FROM alpine:3.3 #...curl and apk commands to install Jdk8... skip here ENV JAVA_HOME=${JAVA_HOME} \ PATH=${PATH}:${JAVA_HOME}/bin VOLUME /jdbctest COPY ./jdbctest.jar /jdbctest/ 

补充我的Spring JDBC连接configuration

 <bean id="db001" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close"> <property name="URL" value="${db001.url}" /> <property name="user" value="${db001.username}"/> <property name="password" value="${db001.password}"/> <property name="connectionCachingEnabled" value="true"/> </bean> 

一些更多的testing:

1)使用centos:最新的基本形象,而不是高山Linux …我可以重复docker运行约4-5次,但后来得到了“java.sql.SQLRecoverableException:没有更多的数据从套接字读取”…问题消失,如果我重新build立docker图像和“docker运行”再次

2)在每次重新运行之前,我都可以在“docker ps -a”中find所有容器的“docker rm”,发现同样的问题。

3)通过连接另一个Oracle数据库服务器进行testing…同样的问题仍然存在。 Oracle数据库版本是Oracle数据库11g企业版版本11.2.0.4.0 – 64位。 我正在使用ojdbc6.jar jdbc驱动程序。

4)如果我运行相同的jar没有包装在docker集装箱内,这个问题没有发生