3.3.1. Connecting to Databases
CUBA application obtains connections to a database through JDBC DataSource. A data source can be configured in the application or obtained from JNDI. The method of obtaining the data source is specified by the cuba.dataSourceProvider application property: it can be either application or jndi.
You can easily configure connections for the main and additional data stores using CUBA Studio, see its documentation. The information below can be helpful for troubleshooting and for defining parameters not available in Studio, e.g. connection pool settings.
- Configuring a Data Source in the Application
-
When the data source is configured in the application, the framework creates a connection pool using HikariCP. Both the connection parameters and the pool settings are configured using application properties located in the
app.propertiesfile of thecoremodule. This is the recommended way if you don’t need a specific connection pool provided by an application server.The following application properties define the database type and connection parameters:
-
cuba.dbmsType- defines the DBMS type. -
cuba.dataSourceProvider-applicationvalue indicates that the data source must be configured using application properties. -
cuba.dataSource.username- the database user name. -
cuba.dataSource.password- the database user password. -
cuba.dataSource.dbName- the database name. -
cuba.dataSource.host- the database host. -
cuba.dataSource.port- optional parameter, sets the database port if it is non-standard for the selected DBMS type. -
cuba.dataSource.jdbcUrl- optional parameter, sets the full JDBC URL if some additional connection parameters need to be passed. Note that all separate properties described above are still required for database migration tasks.
In order to configure connection pool settings, specify the HikariCP properties prefixed with
cuba.dataSource., for examplecuba.dataSource.maximumPoolSizeorcuba.dataSource.connectionTimeout. See the full list of supported parameters and their default values in the HikariCP documentation.If your application uses additional data stores, you should define the same set of parameters for each data store. The data store name is added to the second part of each property name:
For example:
# main data store connection parameters cuba.dbmsType = hsql cuba.dataSourceProvider = application cuba.dataSource.username = sa cuba.dataSource.password = cuba.dataSource.dbName = demo cuba.dataSource.host = localhost cuba.dataSource.port = 9111 cuba.dataSource.maximumPoolSize = 20 # names of additional data stores cuba.additionalStores = clients,orders # 'clients' data store connection parameters cuba.dbmsType_clients = postgres cuba.dataSourceProvider_clients = application cuba.dataSource_clients.username = postgres cuba.dataSource_clients.password = postgres cuba.dataSource_clients.dbName = clients_db cuba.dataSource_clients.host = localhost # 'orders' data store connection parameters cuba.dbmsType_orders = mssql cuba.dataSourceProvider_orders = application cuba.dataSource_orders.jdbcUrl = jdbc:sqlserver://localhost;databaseName=orders_db;currentSchema=my_schema cuba.dataSource_orders.username = sa cuba.dataSource_orders.password = myPass123 cuba.dataSource_orders.dbName = orders_db cuba.dataSource_orders.host = localhostBesides, for each additional data store, the
spring.xmlfile of thecoremodule must contain a definition of theCubaDataSourceFactoryBeanbean with the appropriatestoreNameparameter. For example:<bean id="cubaDataSource_clients" class="com.haulmont.cuba.core.sys.CubaDataSourceFactoryBean"> <property name="storeName" value="clients"/> </bean> <bean id="cubaDataSource_orders" class="com.haulmont.cuba.core.sys.CubaDataSourceFactoryBean"> <property name="storeName" value="orders"/> </bean>If you configure the data source in the application, the database migration Gradle tasks may have no parameters, as they will be obtained from the same set of application properties. This is an additional benefit of configuring data sources in the application. For example:
task createDb(dependsOn: assembleDbScripts, description: 'Creates local database', type: CubaDbCreation) { } task updateDb(dependsOn: assembleDbScripts, description: 'Updates local database', type: CubaDbUpdate) { } -
- Obtaining a Data Source from JNDI
-
If you want to use a data source provided by an application server via JNDI, define the following application properties in the
app.propertiesfile of thecoremodule:-
cuba.dbmsType- defines the DBMS type. -
cuba.dataSourceProvider-jndivalue indicates that the data source must be obtained from JNDI.
The JNDI name of the data source is specified in the cuba.dataSourceJndiName application property, which is
java:comp/env/jdbc/CubaDSby default. For additional data stores, specify the same properties adding the data store name.For example:
# main data store connection parameters cuba.dbmsType = hsql cuba.dataSourceProvider = jndi # names of additional data stores cuba.additionalStores = clients,orders # 'clients' data store connection parameters cuba.dbmsType_clients = postgres cuba.dataSourceProvider_clients = jndi cuba.dataSourceJndiName_clients = jdbc/ClientsDS # 'orders' data store connection parameters cuba.dbmsType_orders = mssql cuba.dataSourceProvider_orders = jndi cuba.dataSourceJndiName_orders = jdbc/OrdersDSBesides, for each additional data store, the
spring.xmlfile of thecoremodule must contain a definition of theCubaDataSourceFactoryBeanbean with the appropriatestoreNameandjndiNameAppPropertyparameters. For example:<bean id="cubaDataSource_clients" class="com.haulmont.cuba.core.sys.CubaDataSourceFactoryBean"> <property name="storeName" value="clients"/> <property name="jndiNameAppProperty" value="cuba.dataSourceJndiName_clients"/> </bean> <bean id="cubaDataSource_orders" class="com.haulmont.cuba.core.sys.CubaDataSourceFactoryBean"> <property name="storeName" value="orders"/> <property name="jndiNameAppProperty" value="cuba.dataSourceJndiName_orders"/> </bean>Data sources provided via JNDI are configured in a way specific to the application server. In Tomcat, it is done in the context.xml file. CUBA Studio writes connection parameters into
modules/core/web/META-INF/context.xmland use this file in the standard deployment process when developing the application.If the data source is configured in
context.xml, the database migration Gradle tasks must have own parameters defining the database connection, for example:task createDb(dependsOn: assembleDbScripts, description: 'Creates local database', type: CubaDbCreation) { dbms = 'hsql' host = 'localhost:9111' dbName = 'demo' dbUser = 'sa' dbPassword = '' } task updateDb(dependsOn: assembleDbScripts, description: 'Updates local database', type: CubaDbUpdate) { dbms = 'hsql' host = 'localhost:9111' dbName = 'demo' dbUser = 'sa' dbPassword = '' } -