Проблемы с доступом к источнику данных в 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="(&(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