Проблемы с доступом к источнику данных в Karaf 4 из Apache Camel

Я создал источник данных в Karaf 4 (ServiceMix 7), который работает с консоли karaf - я могу перечислять таблицы, выполнять запросы и так далее. Моя проблема, когда я пытаюсь использовать это из моего маршрута Camel.

Выдержка из моего проекта:

...
<reference filter="(osgi.jndi.service.name=jdbc/erp)" id="erpDataSource" interface="javax.sql.DataSource"/>
...
<to id="erpSelectQuery" uri="jdbc:erpDataSource"/>
...

Он находит мой источник данных, но проект не может начаться из-за:

"java.lang.IllegalArgumentException: connectionFactory must be specified"

Мой источник данных был создан с использованием:

jdbc:ds-create -dbName erp -dt DataSource -dn mysql -u erp -dc com.mysql.jdbc.Driver -p pre jdbc/erp

Я в недоумении

1 ответ

Я никогда не делал это с помощью синтаксиса команды jdbc. Я следовал указаниям по созданию источника Wiki On Datasource Ops4J, который мне нравится только по одной причине. Этот метод создает простой текстовый файл, которым может управлять не только разработчик Java, т.е. легче изменить и устранить неисправности.

Чтобы не подвергать свой ответ ссылочной гнили, я просто опишу процедуру здесь.

Создайте файл конфигурации источника данных (простой текстовый файл) в / servicemixhome / etc со следующим соглашением об именах org.ops4j.datasource-give_your_datasource_a_name.cfg,

В конфигурационном файле настройте соответствующие параметры, мой пример выглядит так:

    osgi.jdbc.driver.class = com.mysql.jdbc.Driver
    databaseName=dhData
    user=foo
    url=jdbc:mysql://192.199.199.199:3306/dhData
    password=somepassword
    dataSourceName=myDSName 

Убедитесь, что вы установили ops4j необходимые функции:

feature:install pax-jdbc-mysql pax-jdbc-config

Теперь перечислите источники данных, используя следующий синтаксис:

karaf@root()> service:list javax.sql.DataSource

Это будет повторять что-то вроде списка ниже.

[javax.sql.DataSource]
----------------------

    osgi.jdbc.driver.class = com.mysql.jdbc.Driver
    databaseName=dhData
    user=foo
    url=jdbc:mysql://192.199.199.199:3306/dhData
    password=somepassword
    dataSourceName=myDSName 
Provided by : 
    OPS4J Pax JDBC Config (216)

На этом этапе вы можете ссылаться на источник данных, назначив фильтр osgi в blueprint.xml со следующим синтаксисом:

<reference filter="(&amp;(objectClass=javax.sql.DataSource)(dataSourceName=myDSName ))" id="myData" interface="javax.sql.DataSource"/>

Затем, чтобы ссылаться на это как на свойство компонента, например, вы можете сделать следующее:

    <bean class="foo.bar" id="ImsCbrEventsBean">
        <property name="dataSource" ref="myData"/>
    </bean>

Имейте в виду, что это создает единственное соединение с базой данных, и вы действительно должны создать пул соединений.

Это можно сделать, установив функцию pax-jdbc-pool-dbcp2 или любой из других пулов соединений, но одновременно используя только один, а затем изменив файл конфигурации источника данных, чтобы он содержал соответствующую информацию, как в примере ниже:

    osgi.jdbc.driver.name = mysql
    databaseName=dhData
    user=foo
    url=jdbc:mysql://192.199.199.199:3306/dhData
    password=somepassword
    dataSourceName=myDSName 
    jdbc.pool.maxTotal=32
    jdbc.pool.blockWhenExhausted=true
    jdbc.pool.lifo=false
    jdbc.pool.maxIdle=24
    jdbc.pool.maxWaitMillis=5000
    jdbc.pool.minEvictableIdleTimeMillis=1800000
    jdbc.pool.minIdle=16
    jdbc.pool.numTestsPerEvictionRun=3
    jdbc.pool.softMinEvictableIdleTimeMillis=-1
    jdbc.pool.testOnBorrow=true
    jdbc.pool.testOnCreate=true
    jdbc.pool.testOnReturn=true
    jdbc.pool.testWhileIdle=true
    jdbc.pool.timeBetweenEvictionRunsMillis=3600000
Другие вопросы по тегам