Initialisation
Torque is initialized by calling one of the Torque.init()
methods. Torque must be initialized before it is used, and it must not
be initialized more than once.
When calling one of the Torque.init()
methods, you
must supply either the path to a configuration file or the configuration
itself. The configuration must contain a valid DataSource
,
a default database handle, and an adapter for each
DataSource
.
For details, see the section Configuration
below.
Upon initialisation, also the runtime model of the database,
i.e. the DatabaseMaps
, are built by generated
MapBuilder
classes. This happens automatically,
so usually you need not bother about it.
Also, a runtime model of the database
(accessible via the methods Torque.getDatabaseMap())
is built during Torque startup:
Each peer class constructs its runtime model when the Base Peer Class
is loaded and registers the table model with the corresponding database
model in the Torque runtime.
(Usually, a peer class is loaded if one of the constants
for a column name is accessed, or a method is called).
If the property torque.om.generateMapInit
was set to true while generating the torque classes,
the map builder will then also load the peer classes
for all other tables in the same database, which will register all
tables in the database.
This means that possibly you will not see a table in the database map if
its peer class is not loaded. If you want to make sure that all
tables appear in the Database map, set the property
torque.om.generateMapInit
to true when generating
the torque classes, and then call the initDatabaseMap()
method of any generated peer class.
Configuration
Database handles
A database handle is the name attribute that was used in the
<database>
tag of the schema.xml file. If the name
attribute is not used, then the handle would be 'default'.
In all examples that follow we will use the handle 'bookstore'. As Torque has the ability to use multiple databases you can tell it which one to use by default thus:
torque.database.default=bookstore
The handle name 'default' is reserved, as Torque uses it as a reference to the default database. So you should not define the handle 'default' yourself (but of course you can use it e.g. in generated code).
Database Adapters
For each database handle, an adapter must be configured (adapters are used to account for differences among databases). The adapter property is given as:
torque.database.bookstore.adapter=mysql
The valid values are:
|
|
For application in environments that should support different databases,
you can use the special adapter auto
, which tries to
detect the correct adapter type from JDBC metadata.
If you want to use a custom adapter that is not supplied by Torque,
you need to choose a custom key (not one of the above) and specify
the class of the adapter. For example, if the adapter class is
com.acme.DBMyAdapter
, you could use the following
snippet in your configuration file:
torque.database.bookstore.adapter=myadapter torque.database.bookstore.adapter.myadapter.className=com.acme.DBMyAdapter
Connection pool
Torque can use any connection pool implementing the interface
DataSource
. Torque expects a factory that can return a
DataSource
which can be configured using Torque's
configuration file.
Torque provides factories to use the commons-dbcp pools as well as a
general factory that uses JNDI to retrieve the DataSource
.
The JNDI factory looks up a DataSource
bound to JNDI; it
also provides a simple property file based way
to configure and deploy most DataSource
's,
though in many cases a pool may already be bound to JNDI
and Torque only needs to use it.
See the sections
SharedPoolDataSourceFactory
and
JndiDataSourceFactory
for the most commonly used built-in data source factories in Torque.
Multiple databases
The configuration of multiple databases is very similar to the configurations described in the rest of this section, however you will need to define more than one database handle.
SharedPoolDataSourceFactory
This factory uses the SharedDataSource available in the commons-dbcp package. SharedPoolDataSourceFactory provides an easy way to configure this pool and it assumes you will have a JDBC Driver class providing the physical database connections. Again, you must let Torque know you are using this factory:
torque.dsfactory.bookstore.factory= \ org.apache.torque.dsfactory.SharedPoolDataSourceFactory
The SharedPoolDataSourceFactory depends on commons-dbcp which is an optional dependency of the Torque runtime. So don't forget to add the dependency to your project if you want to use this factory:
<dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency>
Then there are two sets of properties related to the pool configuration and settings for making the connection to the database. The "connection" set contains all information to create a physical connection to the database:
torque.dsfactory.bookstore.connection.driver = org.gjt.mm.mysql.Driver torque.dsfactory.bookstore.connection.url = jdbc:mysql://localhost:3306/bookstore torque.dsfactory.bookstore.connection.user = root torque.dsfactory.bookstore.connection.password = 1234
The "pool" set contains information of how the pool should handle the physical connections. See the dbcp reference for possible properties. For example, you could use:
torque.dsfactory.bookstore.pool.maxActive=30 torque.dsfactory.bookstore.pool.testOnBorrow=true torque.dsfactory.bookstore.pool.validationQuery=SELECT 1
Torque also includes a factory for the
PerUserPoolDataSource
.
Please see the commons-dbcp javadoc for more info.
SharedPool2DataSourceFactory
This factory uses the SharedDataSource available in the commons-dbcp2 package. All other properties are identical to those of the SharedPoolDataSourceFactory.
The SharedPool2DataSourceFactory depends on commons-dbcp2 which is an optional dependency of the Torque runtime. So don't forget to add the dependency to your project if you want to use this factory:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.1.1</version> </dependency>
The "pool" set contains information of how the pool should handle the physical connections. See the dbcp reference for possible properties.
Torque also includes a factory for the
PerUserPoolDataSource
.
Please see the commons-dbcp2 javadoc for more info.
JndiDataSourceFactory
This factory is used if the DataSource
is to be available
via JNDI. It is possible to use this factory to deploy a
DataSource
into JNDI, but in many cases for using this
factory the DataSource
is already deployed.
This factory is specified with the following property:
torque.dsfactory.bookstore.factory = \ org.apache.torque.dsfactory.JndiDataSourceFactory
Using JndiDataSourceFactory with pre-configured pool
In this section, it is assumed that a DataSource
is available via JNDI. Usually, a J2EE environment can be configured
to bind a DataSource
into JNDI for further use.
For example, Tomcat can bind a DataSource
into JNDI, see
the Tomcat Documentation
for details.
If a pool is known to already be available via JNDI, only one more property is required for Torque:
torque.dsfactory.bookstore.jndi.path=jdbc/bookstore
This line defines the string that will be used to lookup the
DataSource
within the default JNDI
InitialContext
.
If everything is configured and the default InitialContext
contains the DataSource
, this is all that is
needed. The default InitialContext
is chosen
according to the rules given in the class's javadoc.
If the default has not been configured, you can specify any other
environment properties that are needed to instantiate
the InitialContext
as extra properties of the form,
torque.jndi.<handle>.<env-var>.
A couple of examples are shown below:
torque.dsfactory.bookstore.jndi.java.naming.factory.initial = \ org.apache.naming.java.javaURLContextFactory torque.dsfactory.bookstore.jndi.java.naming.factory.url.pkgs = \ org.apache.naming
Such environment settings will most likely not be necessary when running within a J2EE container, but they are useful in other cases.
One of the advantages of JNDI is that it supports changing
the DataSource
on the fly.
On the other hand this means that the actual DataSource
object must be looked up in the context with every database operation.
To avoid this, the factory provides a simple caching mechanism,
which stores the DataSource
object for a configurable
amount of time (im ms). The time between two
lookups is specified as follows:
torque.dsfactory.bookstore.jndi.ttl=60000
This property is optional. If not specified, it defaults to 0 (no caching).
Using Torque to bind a pool to JNDI
Generally a J2EE environment such as a servlet engine or application
server is expected to provide a jdbc2 compatible connection pool.
If your application is not running within such an environment,
or even if it is and Torque is your only use of a connection pool,
Torque provides a simple properties file method of configuring a
DataSource
and deploying it via JNDI.
Too use this feature, you need to specify the JNDI configuration
parameters as shown above, setting the factory and the JNDI path.
In addition to that, you need to configure
the DataSource
which should be bound into JNDI.
The one property that is necessary for all DataSource
's
is the classname of the DataSource
implementation.
Beyond that the properties are implementation specific, depending on the
DataSource
's setters for the configuration.
You can specify the values for the setters as properties in the
configuration file. For example, dbcp's BasicDataSource
could be configured as shown below:
torque.dsfactory.bookstore.datasource.classname= \ org.apache.commons.dbcp.BasicDataSource torque.dsfactory.bookstore.datasource.driver = org.gjt.mm.mysql.Driver torque.dsfactory.bookstore.datasource.url = jdbc:mysql://localhost:3306/bookstore torque.dsfactory.bookstore.datasource.user = root torque.dsfactory.bookstore.datasource.password = 1234
plus the properties for the factory and the jndi path:
torque.dsfactory.bookstore.factory = \ org.apache.torque.dsfactory.JndiDataSourceFactory torque.dsfactory.bookstore.jndi.path=jdbc/bookstore
Note that in dbcp 1.2.1, the SharedPoolDataSourceFactory and PerUserPoolDataSourceFactory cannot be bound into jndi (this is a dbcp problem).
Using Database Schemas (Namespaces)
Configuring Schema Names at Runtime
You can configure the default database schema (mysql-speak: "database")
which is prepended to table names in the runtime either per database
or as a global setting.
(The old way of configuring a schema per-datasource was removed
in Torque 5.0).
Defining a schema allows e.g. in oracle to access another
database schema than the one of the user which connects to the database.
To configure a schema, add the following statements to the
torque.properties
file:
## ## Selecting a database schema for all data sources: ## # All data sources use the public schema unless overridden torque.defaults.schema = public ## ## Selecting the schema 'foo' for the database "bar" # use the foo database torque.database.bar.schema = foo
If no schema is configured in the torque properties or in other places, Torque will not qualify its table names.
Other Means to Control schemas
You can change the schema which is used for unqualified table names per-Database in the Torque Runtime. The schema name is queried dynamically whenever a Torque command accesses the database and can be changed (if you have the same table layout on multiple schemas, you can reuse your Peer classes thus reducing the number of classes used).
/* Set the schema name for database "bar" to "foo" */ Torque.setSchema("bar", "foo"); /* Reset the schema names (no longer qualify * accesses to the tables of the "bar" database */ Torque.setSchema("bar", null); /* Get the current schema for the "bar" database */ String barSchema = Torque.getSchema("bar");
Examples
In this section, the bits explained above are assembled to full examples of configuration files for the Torque runtime. Do not forget to change the values to match your database environment.
Using SharedPoolDataSourceFactory (this example is also used in the Tutorial):
torque.database.default = bookstore torque.database.bookstore.adapter = mysql #Using commons-dbcp torque.dsfactory.bookstore.factory =\ org.apache.torque.dsfactory.SharedPoolDataSourceFactory torque.dsfactory.bookstore.connection.driver = org.gjt.mm.mysql.Driver torque.dsfactory.bookstore.connection.url =\ jdbc:mysql://localhost:3306/bookstore torque.dsfactory.bookstore.connection.user = user torque.dsfactory.bookstore.connection.password = password
Using JndiDataSourceFactory with externally bound
DataSource
:
torque.database.default = bookstore torque.database.bookstore.adapter = mysql torque.dsfactory.bookstore.factory =\ org.apache.torque.dsfactory.JndiDataSourceFactory torque.dsfactory.bookstore.jndi.path = jdbc/jndiTestDataSource
Using JndiDataSourceFactory to bind a DataSource
to jndi:
torque.database.default = bookstore torque.database.bookstore.adapter = mysql torque.dsfactory.bookstore.factory =\ org.apache.torque.dsfactory.JndiDataSourceFactory torque.dsfactory.bookstore.jndi.path = jdbc/jndiTestDataSource torque.dsfactory.bookstore.jndi.java.naming.factory.initial =\ org.apache.naming.java.javaURLContextFactory torque.dsfactory.bookstore.datasource.classname =\ org.apache.commons.dbcp.BasicDataSource torque.dsfactory.bookstore.datasource.password = mysql torque.dsfactory.bookstore.datasource.username = root torque.dsfactory.bookstore.datasource.driverClassName =\ org.gjt.mm.mysql.Driver torque.dsfactory.bookstore.datasource.url =\ jdbc:mysql://localhost:3306/bookstore