【问题标题】:How to configure activemq to use informix database?如何配置activemq使用informix数据库?
【发布时间】:2013-04-15 21:42:09
【问题描述】:

我正在使用 apache activemq 5.8。这是我所做的:

1) 将informix jdbc jar (ifxjdbc-3.70-JC3.jar) 放入activemq/libs/optional

2) 在activemq.xml中声明bean:

 <bean id="informix-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.informix.jdbc.IfxDriver"/>
    <property name="url" value="jdbc:informix-sqli://192.168.7.30:21893/activemq_nightly:informixserver=ol_informix1170_1;IFX_LOCK_MODE_WAIT=20;IFX_ISOLATION_LEVEL=TRANSACTION_READ_UNCOMMITTED"/>
    <property name="username" value="XXXX" />
    <property name="password" value="XXXX" />
    <property name="maxActive" value="200" />
    <property name="poolPreparedStatements" value="true"/>
</bean>

3) 更改 activemq.xml 中的持久化适配器:

    <persistenceAdapter>
    <jdbcPersistenceAdapter dataSource="#informix-ds"/>
    </persistenceAdapter>

我在informix 连接字符串中设置了隔离级别,因为在启动activemq 时出现“不支持事务”错误。 现在我得到了这个例外:

2013-04-12 14:21:23,196 | ERROR | Failed to start Apache ActiveMQ (localhost, null). Reason: java.io.IOException: Cannot create PoolableConnectionFactory (Transaction not available.) | org.apache.activemq.broker.BrokerService | main

java.io.IOException:无法创建 PoolableConnectionFactory(事务不可用。) 在 org.apache.activemq.util.IOExceptionSupport.create(IOExceptionSupport.java:45) 在 org.apache.activemq.store.jdbc.TransactionContext.getConnection(TransactionContext.java:65) 在 org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.loadAdapter(JDBCPersistenceAdapter.java:440) 在 org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.createAdapter(JDBCPersistenceAdapter.java:423) 在 org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.getAdapter(JDBCPersistenceAdapter.java:368) 在 org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.init(JDBCPersistenceAdapter.java:289) 在 org.apache.activemq.broker.LockableServiceSupport.preStart(LockableServiceSupport.java:79) 在 org.apache.activemq.util.ServiceSupport.start(ServiceSupport.java:54) 在 org.apache.activemq.broker.BrokerService.doStartPersistenceAdapter(BrokerService.java:623) 在 org.apache.activemq.broker.BrokerService.startPersistenceAdapter(BrokerService.java:612) 在 org.apache.activemq.broker.BrokerService.start(BrokerService.java:577) 在 org.apache.activemq.xbean.XBeanBrokerService.afterPropertiesSet(XBeanBrokerService.java:58) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1546) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1487) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1419) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:518) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:455) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) 在 org.apache.xbean.spring.context.ResourceXmlApplicationContext.(ResourceXmlApplicationContext.java:64) 在 org.apache.xbean.spring.context.ResourceXmlApplicationContext.(ResourceXmlApplicationContext.java:52) 在 org.apache.activemq.xbean.XBeanBrokerFactory$1.(XBeanBrokerFactory.java:102) 在 org.apache.activemq.xbean.XBeanBrokerFactory.createApplicationContext(XBeanBrokerFactory.java:102) 在 org.apache.activemq.xbean.XBeanBrokerFactory.createBroker(XBeanBrokerFactory.java:66) 在 org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:71) 在 org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:54) 在 org.apache.activemq.console.command.StartCommand.startBroker(StartCommand.java:115) 在 org.apache.activemq.console.command.StartCommand.runTask(StartCommand.java:74) 在 org.apache.activemq.console.command.AbstractCommand.execute(AbstractCommand.java:57) 在 org.apache.activemq.console.command.ShellCommand.runTask(ShellCommand.java:148) 在 org.apache.activemq.console.command.AbstractCommand.execute(AbstractCommand.java:57) 在 org.apache.activemq.console.command.ShellCommand.main(ShellCommand.java:90) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.apache.activemq.console.Main.runTaskClass(Main.java:262) 在 org.apache.activemq.console.Main.main(Main.java:115) 原因:org.apache.commons.dbcp.SQLNestedException:无法创建 PoolableConnectionFactory(事务不可用。) 在 org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549) 在 org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388) 在 org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) 在 org.apache.activemq.store.jdbc.TransactionContext.getConnection(TransactionContext.java:58) ... 45 更多 原因:java.sql.SQLException:事务不可用。 在 com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:413) 在 com.informix.jdbc.IfxSqli.a(IfxSqli.java:3550) 在 com.informix.jdbc.IfxSqli.E(IfxSqli.java:3871) 在 com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2662) 在 com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli.java:2578) 在 com.informix.jdbc.IfxSqli.c(IfxSqli.java:1512) 在 com.informix.jdbc.IfxSqli.executeExecute(IfxSqli.java:2493) 在 com.informix.jdbc.IfxSqli.executeExecute(IfxSqli.java:2430) 在 com.informix.jdbc.IfxResultSet.b(IfxResultSet.java:393) 在 com.informix.jdbc.IfxStatement.a(IfxStatement.java:1326) 在 com.informix.jdbc.IfxStatement.executeImpl(IfxStatement.java:1296) 在 com.informix.jdbc.IfxStatement.c(IfxStatement.java:1007) 在 com.informix.jdbc.IfxStatement.execute(IfxStatement.java:893) 在 com.informix.jdbc.IfxSqliConnect.setServerIsolationLevel(IfxSqliConnect.java:6976) 在 com.informix.jdbc.IfxSqliConnect.j(IfxSqliConnect.java:6947) 在 com.informix.jdbc.IfxSqliConnect.(IfxSqliConnect.java:1766) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:513) 在 com.informix.jdbc.IfxDriver.connect(IfxDriver.java:254) 在 org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38) 在 org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582) 在 org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556) 在 org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1545) ... 48 更多 引起:java.sql.SQLException 在 com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:413) 在 com.informix.jdbc.IfxSqli.E(IfxSqli.java:3876)

当我启动 activemq 时出现以下错误:

【问题讨论】:

    标签: jakarta-ee activemq informix


    【解决方案1】:

    1) 下载最新的activemq版本

    2) vi ACTIVEMQ_HOME/conf/activemq.xml

    3) 添加如下bean配置来配置informix ds:

    <bean id="informix-ds" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="com.informix.jdbc.IfxDriver"/>
    <property name="jdbcUrl" value="jdbc:informix-sqli://192.168.7.30:21893/XXX:informixserver=ol_informix1170_1;IFX_LOCK_MODE_WAIT=20;IFX_ISOLATION_LEVEL=TRANSACTION_READ_UNCOMMITTED"/>
    <property name="user" value="XXXXX" />
    <property name="password" value="XXXX" />
    

    注意:Informix 连接字符串应包含:IFX_ISOLATION_LEVEL=TRANSACTION_READ_UNCOMMITTED。数据源实现应该是 com.mchange.v2.c3p0.ComboPooledDataSource

    4) 将 ds 注册为持久化适配器:

        <persistenceAdapter>
    

    --> 5) 下载c3p0-0.8.4.5.jar和ifxjdbc-3.70-JC3.jar并复制到ACTIVEMQ_HOME/lib/optional

    6) 启动activemq,尽情享受吧!

    注意:如果 activemq 抱怨缺少 db 表,请检查您的数据库是否使用单字节字符集或手动创建具有适当约束的缺少表(仅适用于 dev env)。

    【讨论】:

      【解决方案2】:

      一个很好的猜测是informix help 中描述的内容

      -122 ISAM 错误:事务不可用。

      已要求 ISAM 处理器标记一个开始或结束 事务,但事务日志无效。对于 C-ISAM 程序,此文件未通过日志记录打开。查看调用 isopen,并确保包含 ISTRANS 参数。对于 SQL 产品,此数据库不支持事务日志记录。如果你 正在使用数据库服务器,有数据库服务器管理员 启用此数据库的日志记录。否则,使用 START DATABASE 语句开始事务记录。在所有情况下,日志记录都应该 仅在数据库完全备份后立即启动。

      【讨论】:

      • 我创建了带有日志记录的新数据库,但现在我遇到了其他异常:
      • 使用持久性适配器:JDBCPersistenceAdapter(com.mchange.v2.c3p0.ComboPooledDataSource@1f38fc6) | org.apache.activemq.broker.BrokerService |主要 2013-04-15 14:41:33,108 |警告 |无法获得 JDBC 连接:java.lang.Object.wait(Native Method) 处的 java.lang.InterruptedException
      猜你喜欢
      • 2012-03-20
      • 1970-01-01
      • 2023-04-04
      • 2017-12-30
      • 1970-01-01
      • 2012-06-01
      • 2017-07-10
      • 2011-09-08
      • 1970-01-01
      相关资源
      最近更新 更多