blob: 1338b885e31022a165b46e42929a829f2b7ee90c [file] [log] [blame]
type=page
status=published
title=Using the JDBC API for Database Access
next=transaction-service.html
prev=part-services-and-apis.html
~~~~~~
= Using the JDBC API for Database Access
[[GSDVG00017]][[beamj]]
[[using-the-jdbc-api-for-database-access]]
== 14 Using the JDBC API for Database Access
This chapter describes how to use the Java Database Connectivity (JDBC)
API for database access with the {productName}. This chapter
also provides high level JDBC implementation instructions for servlets
and EJB components using the {productName}.
The JDBC specifications are available at
`http://www.oracle.com/technetwork/java/javase/jdbc/index.html`.
A useful JDBC tutorial is located at
`http://docs.oracle.com/javase/tutorial/jdbc/index.html`.
[NOTE]
====
The {productName} does not support connection pooling or transactions
for an application's database access if it does not use standard Jakarta EE
`DataSource` objects.
====
The following topics are addressed here:
* link:#giyck[Statements]
* link:#giyeq[Connections]
* link:#giyde[Connection Wrapping]
* link:#gavro[Allowing Non-Component Callers]
* link:#giydx[Using Application-Scoped Resources]
* link:#geqvg[Restrictions and Optimizations]
[[giyck]][[GSDVG00182]][[statements]]
=== Statements
The following topics are addressed here:
* link:#giyfu[Using an Initialization Statement]
* link:#ghqrx[Setting a Statement Timeout]
* link:#gktbf[Statement Leak Detection and Leaked Statement Reclamation]
* link:#giyci[Statement Caching]
* link:#giygg[Statement Tracing]
[[giyfu]][[GSDVG00495]][[using-an-initialization-statement]]
==== Using an Initialization Statement
You can specify a statement that executes each time a physical
connection to the database is created (not reused) from a JDBC
connection pool. This is useful for setting request or session specific
properties and is suited for homogeneous requests in a single
application. Set the Init SQL attribute of the JDBC connection pool to
the SQL string to be executed in one of the following ways:
* Enter an Init SQL value in the Edit Connection Pool Advanced
Attributes page in the Administration Console. For more information,
click the Help button in the Administration Console.
* Specify the `--initsql` option in the
`asadmin create-jdbc-connection-pool` command. For more information, see
the link:reference-manual.html#GSRFM[{productName} Reference Manual].
* Specify the `init-sql` option in the `asadmin set` command. For
example:
+
[source]
----
asadmin set domain1.resources.jdbc-connection-pool.DerbyPool.init-sql="sql-string"
----
For more information, see the link:reference-manual.html#GSRFM[{productName} Reference Manual].
[[ghqrx]][[GSDVG00496]][[setting-a-statement-timeout]]
==== Setting a Statement Timeout
An abnormally long running JDBC query executed by an application may
leave it in a hanging state unless a timeout is explicitly set on the
statement. Setting a statement timeout guarantees that all queries
automatically time out if not completed within the specified period.
When statements are created, the `queryTimeout` is set according to the
statement timeout setting. This works only when the underlying JDBC
driver supports `queryTimeout` for `Statement`, `PreparedStatement`,
`CallableStatement`, and `ResultSet`.
You can specify a statement timeout in the following ways:
* Enter a Statement Timeout value in the Edit Connection Pool Advanced
Attributes page in the Administration Console. For more information,
click the Help button in the Administration Console.
* Specify the `--statementtimeout` option in the
`asadmin create-jdbc-connection-pool` command. For more information, see
the link:reference-manual.html#GSRFM[{productName} Reference Manual].
[[gktbf]][[GSDVG00497]][[statement-leak-detection-and-leaked-statement-reclamation]]
==== Statement Leak Detection and Leaked Statement Reclamation
If statements are not closed by an application after use, it is possible
for the application to run out of cursors. Enabling statement leak
detection causes statements to be considered as leaked if they are not
closed within a specified period. Additionally, leaked statements can
reclaimed automatically.
To enable statement leak detection, set Statement Leak Timeout In
Seconds for the JDBC connection pool to a positive, nonzero value in one
of the following ways:
* Specify the `--statementleaktimeout` option in the
`create-jdbc-connection-pool` subcommand. For more information, see
link:reference-manual/create-jdbc-connection-pool.html#GSRFM00036[`create-jdbc-connection-pool`(1)].
* Specify the `statement-leak-timeout-in-seconds` option in the `set`
subcommand. For example:
+
[source]
----
asadmin set resources.jdbc-connection-pool.pool-name.statement-leak-timeout-in-seconds=300
----
When selecting a value for Statement Leak Timeout In Seconds, make sure
that:
* It is less than the Connection Leak Timeout; otherwise, the connection
could be closed before the statement leak is recognized.
* It is greater than the Statement Timeout; otherwise, a long running
query could be mistaken as a statement leak.
After enabling statement leak detection, enable leaked statement
reclamation by setting Reclaim Leaked Statements for the JDBC connection
pool to a `true` value in one of the following ways:
* Specify the `--statementleakreclaim=true` option in the
`create-jdbc-connection-pool` subcommand. For more information, see
link:reference-manual/create-jdbc-connection-pool.html#GSRFM00036[`create-jdbc-connection-pool`(1)].
* Specify the `statement-leak-reclaim` option in the `set` subcommand.
For example:
+
[source]
----
asadmin set resources.jdbc-connection-pool.pool-name.statement-leak-reclaim=true
----
[[giyci]][[GSDVG00498]][[statement-caching]]
==== Statement Caching
Statement caching stores statements, prepared statements, and callable
statements that are executed repeatedly by applications in a cache,
thereby improving performance. Instead of the statement being prepared
each time, the cache is searched for a match. The overhead of parsing
and creating new statements each time is eliminated.
Statement caching is usually a feature of the JDBC driver. The {productName} provides caching for drivers that do not support caching. To
enable this feature, set the Statement Cache Size for the JDBC
connection pool in one of the following ways:
* Enter a Statement Cache Size value in the Edit Connection Pool
Advanced Attributes page in the Administration Console. For more
information, click the Help button in the Administration Console.
* Specify the `--statementcachesize` option in the
`asadmin create-jdbc-connection-pool` command. For more information, see
the link:reference-manual.html#GSRFM[{productName} Reference Manual].
* Specify the `statement-cache-size` option in the `asadmin set`
command. For example:
+
[source]
----
asadmin set domain1.resources.jdbc-connection-pool.DerbyPool.statement-cache-size=10
----
For more information, see the link:reference-manual.html#GSRFM[{productName} Reference Manual].
By default, this attribute is set to zero and the statement caching is
turned off. To enable statement caching, you can set any positive
nonzero value. The built-in cache eviction strategy is LRU-based (Least
Recently Used). When a connection pool is flushed, the connections in
the statement cache are recreated.
[[giygg]][[GSDVG00499]][[statement-tracing]]
==== Statement Tracing
You can trace the SQL statements executed by applications that use a
JDBC connection pool. Set the SQL Trace Listeners attribute to a
comma-separated list of trace listener implementation classes in one of
the following ways:
* Enter an SQL Trace Listeners value in the Edit Connection Pool
Advanced Attributes page in the Administration Console. For more
information, click the Help button in the Administration Console.
* Specify the `--sqltracelisteners` option in the
`asadmin create-jdbc-connection-pool` command. For more information, see
the link:reference-manual.html#GSRFM[{productName} Reference Manual].
* Specify the `sql-trace-listeners` option in the `asadmin set` command.
For example:
+
[source]
----
asadmin set domain1.resources.jdbc-connection-pool.DerbyPool.sql-trace-listeners=listeners
----
For more information, see the link:reference-manual.html#GSRFM[{productName} Reference Manual].
The {productName} provides a public interface,
org.glassfish.api.jdbc.SQLTraceListener , that implements a means of
recording `SQLTraceRecord` objects. To make custom implementations of
this interface available to the {productName}, place the
implementation classes in as-install``/lib``.
The {productName} provides an SQL tracing logger to log the SQL
operations in the form of `SQLTraceRecord` objects in the `server.log`
file. The module name under which the SQL operation is logged is
`jakarta.enterprise.resource.sqltrace`. SQL traces are logged as FINE
messages along with the module name to enable easy filtering of the SQL
logs. A sample SQL trace record looks like this:
[source]
----
[#|2009-11-27T15:46:52.202+0530|FINE|glassfish 6.0|jakarta.enterprise.resource.sqltrace.com.sun.gjc.util
|_ThreadID=29;_ThreadName=Thread-1;ClassName=com.sun.gjc.util.SQLTraceLogger;MethodName=sqlTrace;
|ThreadID=77 | ThreadName=p: thread-pool-1; w: 6 | TimeStamp=1259317012202
| ClassName=com.sun.gjc.spi.jdbc40.PreparedStatementWrapper40 | MethodName=executeUpdate
| arg[0]=insert into table1(colName) values(100) | arg[1]=columnNames | |#]
----
This trace shows that an `executeUpdate(String sql, String columnNames)`
operation is being done.
When SQL statement tracing is enabled and JDBC connection pool
monitoring is enabled, {productName} maintains a tracing cache of
recent queries and their frequency of use. The following JDBC connection
pool properties can be configured to control this cache and the
monitoring statistics available from it:
`time-to-keep-queries-in-minutes`::
Specifies how long in minutes to keep a query in the tracing cache,
tracking its frequency of use. The default value is 5 minutes.
`number-of-top-queries-to-report`::
Specifies how many of the most used queries, in frequency order, are
listed the monitoring report. The default value is 10 queries.
Set these parameters in one of the following ways:
* Add them as properties in the Edit JDBC Connection Pool Properties
page in the Administration Console. For more information, click the Help
button in the Administration Console.
* Specify them using the `--property` option in the
`create-jdbc-connection-pool` subcommand. For more information, see
link:reference-manual/create-jdbc-connection-pool.html#GSRFM00036[`create-jdbc-connection-pool`(1)].
* Set them using the `set` subcommand. For example:
+
[source]
----
asadmin set resources.jdbc-connection-pool.pool-name.property.time-to-keep-queries-in-minutes=10
----
[[giyeq]][[GSDVG00183]][[connections]]
=== Connections
The following topics are addressed here:
* link:#gktas[Transparent Pool Reconfiguration]
* link:#giygl[Disabling Pooling]
* link:#giydr[Associating Connections with Threads]
* link:#giyfg[Custom Connection Validation]
* link:#beams[Sharing Connections]
* link:#gezfh[Marking Bad Connections]
* link:#gipzl[Handling Invalid Connections]
[[gktas]][[GSDVG00500]][[transparent-pool-reconfiguration]]
==== Transparent Pool Reconfiguration
When the properties or attributes of a JDBC connection pool are changed,
the connection pool is destroyed and re-created. Normally, applications
using the connection pool must be redeployed as a consequence. This
restriction can be avoided by enabling transparent JDBC connection pool
reconfiguration. When this feature is enabled, applications do not need
to be redeployed. Instead, requests for a new connections are blocked
until the reconfiguration operation completes. Connection requests from
any in-flight transactions are served using the old pool configuration
so as to complete the transaction. Then, connections are created using
the pool's new configuration, and any blocked connection requests are
served with connections from the re-created pool..
To enable transparent JDBC connection pool reconfiguration, set the
`dynamic-reconfiguration-wait-timeout-in-seconds` property of the JDBC
connection pool to a positive, nonzero value in one of the following
ways:
* Add it as a property in the Edit JDBC Connection Pool Properties page
in the Administration Console. For more information, click the Help
button in the Administration Console.
* Specify it using the `--property` option in the
`create-jdbc-connection-pool` subcommand. For more information, see
link:reference-manual/create-jdbc-connection-pool.html#GSRFM00036[`create-jdbc-connection-pool`(1)].
* Set it using the `set` subcommand. For example:
+
[source]
----
asadmin set resources.jdbc-connection-pool.pool-name.property.dynamic-reconfiguration-wait-timeout-in-seconds=15
----
This property specifies the time in seconds to wait for in-use
connections to close and in-flight transactions to complete. Any
connections in use or transaction in flight past this time must be
retried.
[[giygl]][[GSDVG00501]][[disabling-pooling]]
==== Disabling Pooling
To disable connection pooling, set the Pooling attribute to false. The
default is true. You can enable or disable connection pooling in one of
the following ways:
* Enter a Pooling value in the Edit Connection Pool Advanced Attributes
page in the Administration Console. For more information, click the Help
button in the Administration Console.
* Specify the `--pooling` option in the
`asadmin create-jdbc-connection-pool` command. For more information, see
the link:reference-manual.html#GSRFM[{productName} Reference Manual].
* Specify the `pooling` option in the `asadmin set` command. For
example:
+
[source]
----
asadmin set domain1.resources.jdbc-connection-pool.DerbyPool.pooling=false
----
For more information, see the link:reference-manual.html#GSRFM[{productName} Reference Manual].
The `pooling` option and the system property
`com.sun.enterprise.connectors.SwitchoffACCConnectionPooling`, which
turns off connection pooling in the Application Client Container, do not
affect each other.
An exception is thrown if `associate-with-thread` is set to `true` and
pooling is disabled. An exception is thrown if you attempt to flush a
connection pool when pooling is disabled. A warning is logged if the
following attributes are used, because they are useful only in a pooled
environment:
* `connection-validation`
* `validate-atmost-once-period`
* `match-connections`
* `max-connection-usage`
* `idle-timeout`
[[giydr]][[GSDVG00502]][[associating-connections-with-threads]]
==== Associating Connections with Threads
To associate connections with a thread, set the Associate With Thread
attribute to `true`. The default is `false`. A `true` setting allows
connections to be saved as `ThreadLocal` in the calling thread.
Connections get reclaimed only when the calling thread dies or when the
calling thread is not in use and the pool has run out of connections. If
the setting is `false`, the thread must obtain a connection from the
pool each time the thread requires a connection.
The Associate With Thread attribute associates connections with a thread
such that when the same thread is in need of connections, it can reuse
the connections already associated with that thread. In this case, the
overhead of getting connections from the pool is avoided. However, when
this value is set to `true`, you should verify that the value of the Max
Pool Size attribute is comparable to the Max Thread Pool Size attribute
of the thread pool. If the Max Thread Pool Size value is much higher
than the Max Pool Size value, a lot of time is spent associating
connections with a new thread after dissociating them from an older one.
Use this attribute in cases where the thread pool should reuse
connections to avoid this overhead.
You can set the Associate With Thread attribute in the following ways:
* Enter an Associate With Thread value in the Edit Connection Pool
Advanced Attributes page in the Administration Console. For more
information, click the Help button in the Administration Console.
* Specify the `--associatewiththread` option in the
`asadmin create-jdbc-connection-pool` command. For more information, see
the link:reference-manual.html#GSRFM[{productName} Reference Manual].
* Specify the `associate-with-thread` option in the `asadmin set`
command. For example:
+
[source]
----
asadmin set domain1.resources.jdbc-connection-pool.DerbyPool.associate-with-thread=true
----
For more information, see the link:reference-manual.html#GSRFM[{productName} Reference Manual].
[[giyfg]][[GSDVG00503]][[custom-connection-validation]]
==== Custom Connection Validation
You can specify a custom implementation for Connection Validation that
is faster or optimized for a specific database. Set the Validation
Method attribute to the value `custom-validation`. (Other validation
methods available are `table` (the default), `auto-commit`, and
`meta-data`.) The {productName} provides a public interface,
org.glassfish.api.jdbc.ConnectionValidation, which you can implement to
plug in your implementation. A new attribute, Validation Classname,
specifies the fully qualified name of the class that implements the
ConnectionValidation interface. The Validation Classname attribute is
required if Connection Validation is enabled and Validation Method is
set to Custom Validation.
To enable this feature, set Connection Validation, Validation Method,
and Validation Classname for the JDBC connection pool in one of the
following ways:
* Enter Connection Validation, Validation Method, and Validation
Classname values in the Edit Connection Pool Advanced Attributes page in
the Administration Console. You can select from among validation class
names for common databases in the Validation Classname field. For more
information, click the Help button in the Administration Console.
* Specify the `--isconnectionvalidatereq`, `--validationmethod`, and
`--validationclassname` options in the
`asadmin create-jdbc-connection-pool` command. For more information, see
the link:reference-manual.html#GSRFM[{productName} Reference Manual].
* Specify the `is-connection-validation-required`,
`connection-validation-method`, and `validation-classname` options in
the `asadmin set` command. For example:
+
[source]
----
asadmin set domain1.resources.jdbc-connection-pool.MyPool.is-connection-validation-required=true
asadmin set domain1.resources.jdbc-connection-pool.MyPool.connection-validation-method=custom-validation
asadmin set domain1.resources.jdbc-connection-pool.MyPool.validation-classname=impl-class
----
For more information, see the link:reference-manual.html#GSRFM[{productName} Reference Manual].
By default, optimized validation mechanisms are provided for DB2, Apache
Derby, MSSQL, MySQL, Oracle, PostgreSQL and Sybase databases.
Additionally, for JDBC 4.0 compliant database drivers, a validation
mechanism is provided that uses the `Connection.isValid(0)`
implementation.
[[beams]][[GSDVG00504]][[sharing-connections]]
==== Sharing Connections
When multiple connections acquired by an application use the same JDBC
resource, the connection pool provides connection sharing within the
same transaction scope. For example, suppose Bean A starts a transaction
and obtains a connection, then calls a method in Bean B. If Bean B
acquires a connection to the same JDBC resource with the same sign-on
information, and if Bean A completes the transaction, the connection can
be shared.
Connections obtained through a resource are shared only if the resource
reference declared by the Jakarta EE component allows it to be shareable.
This is specified in a component's deployment descriptor by setting the
`res-sharing-scope` element to `Shareable` for the particular resource
reference. To turn off connection sharing, set `res-sharing-scope` to
`Unshareable`.
For general information about connections and JDBC URLs, see
"link:administration-guide/jdbc.html#GSADG00015[Administering Database Connectivity]" in {productName} Administration Guide.
[[gezfh]][[GSDVG00505]][[marking-bad-connections]]
==== Marking Bad Connections
The `DataSource` implementation in the {productName} provides a
`markConnectionAsBad` method. A marked bad connection is removed from
its connection pool when it is closed. The method signature is as
follows:
[source,java]
----
public void markConnectionAsBad(java.sql.Connection con)
----
For example:
[source,java]
----
com.sun.appserv.jdbc.DataSource ds=
(com.sun.appserv.jdbc.DataSource)context.lookup("dataSource");
Connection con = ds.getConnection();
Statement stmt = null;
try{
stmt = con.createStatement();
stmt.executeUpdate("Update");
}
catch (BadConnectionException e){
ds.markConnectionAsBad(con) //marking it as bad for removal
}
finally{
stmt.close();
con.close(); //Connection will be destroyed during close.
}
----
[[gipzl]][[GSDVG00506]][[handling-invalid-connections]]
==== Handling Invalid Connections
If a `ConnectionErrorOccured` event occurs, the {productName}
considers the connection invalid and removes the connection from the
connection pool. Typically, a JDBC driver generates a
`ConnectionErrorOccured` event when it finds a `ManagedConnection`
object unusable. Reasons can be database failure, network failure with
the database, fatal problems with the connection pool, and so on.
If the `fail-all-connections` setting in the connection pool
configuration is set to `true`, and a single connection fails, all
connections are closed and recreated. If this setting is `false`,
individual connections are recreated only when they are used. The
default is `false`.
The `is-connection-validation-required` setting specifies whether
connections have to be validated before being given to the application.
If a resource's validation fails, it is destroyed, and a new resource is
created and returned. The default is `false`.
The `prefer-validate-over-recreate` property specifies that validating
idle connections is preferable to closing them. This property has no
effect on non-idle connections. If set to `true`, idle connections are
validated during pool resizing, and only those found to be invalid are
destroyed and recreated. If `false`, all idle connections are destroyed
and recreated during pool resizing. The default is `false`.
You can set the `fail-all-connections`,
`is-connection-validation-required`, and `prefer-validate-over-recreate`
configuration settings during creation of a JDBC connection pool. Or,
you can use the `asadmin set` command to dynamically reconfigure a
setting. For example:
[source]
----
asadmin set server.resources.jdbc-connection-pool.JCPool1.fail-all-connections="true"
asadmin set server.resources.jdbc-connection-pool.JCPool1.is-connection-validation-required="true"
asadmin set server.resources.jdbc-connection-pool.JCPool1.property.prefer-validate-over-recreate="true"
----
For details, see the link:reference-manual.html#GSRFM[{productName}
Reference Manual].
The interface ValidatingManagedConnectionFactory exposes the method
`getInvalidConnections` to allow retrieval of the invalid connections.
The {productName} checks if the JDBC driver implements this
interface, and if it does, invalid connections are removed when the
connection pool is resized.
[[giyde]][[GSDVG00184]][[connection-wrapping]]
=== Connection Wrapping
The following topics are addressed here:
* link:#ghqxi[Wrapping Connections]
* link:#beamt[Obtaining a Physical Connection From a Wrapped Connection]
* link:#ggrum[Using the `Connection.unwrap()` Method]
[[ghqxi]][[GSDVG00507]][[wrapping-connections]]
==== Wrapping Connections
If the Wrap JDBC Objects option is `true` (the default), wrapped JDBC
objects are returned for `Statement`, `PreparedStatement`,
`CallableStatement`, `ResultSet`, and `DatabaseMetaData`.
This option ensures that `Statement.getConnection()` is the same as
`DataSource.getConnection()`. Therefore, this option should be `true`
when both `Statement.getConnection()` and `DataSource.getConnection()`
are done.
You can specify the Wrap JDBC Objects option in the following ways:
* Check or uncheck the Wrap JDBC Objects box on the Edit Connection Pool
Advanced Attributes page in the Administration Console. For more
information, click the Help button in the Administration Console.
* Specify the `--wrapjdbcobjects` option in the
`asadmin create-jdbc-connection-pool` command. For more information, see
the link:reference-manual.html#GSRFM[{productName} Reference Manual].
[[beamt]][[GSDVG00508]][[obtaining-a-physical-connection-from-a-wrapped-connection]]
==== Obtaining a Physical Connection From a Wrapped Connection
The `DataSource` implementation in the {productName} provides a
`getConnection` method that retrieves the JDBC driver's `SQLConnection`
from the {productName}'s `Connection` wrapper. The method signature
is as follows:
[source,java]
----
public java.sql.Connection getConnection(java.sql.Connection con)
throws java.sql.SQLException
----
For example:
[source,java]
----
InitialContext ctx = new InitialContext();
com.sun.appserv.jdbc.DataSource ds = (com.sun.appserv.jdbc.DataSource)
ctx.lookup("jdbc/MyBase");
Connection con = ds.getConnection();
Connection drivercon = ds.getConnection(con); //get physical connection from wrapper
// Do db operations.
// Do not close driver connection.
con.close(); // return wrapped connection to pool.
----
[[ggrum]][[GSDVG00509]][[using-the-connection.unwrap-method]]
==== Using the `Connection.unwrap()` Method
Using the `Connection.unwrap()` method on a vendor-provided interface
returns an object or a wrapper object implementing the vendor-provided
interface, which the application can make use of to do vendor-specific
database operations. Use the `Connection.isWrapperFor()` method on a
vendor-provided interface to check whether the connection can provide an
implementation of the vendor-provided interface. Check the JDBC driver
vendor's documentation for information on these interfaces.
[[gavro]][[GSDVG00185]][[allowing-non-component-callers]]
=== Allowing Non-Component Callers
You can allow non-Java-EE components, such as servlet filters, lifecycle
modules, and third party persistence managers, to use this JDBC
connection pool. The returned connection is automatically enlisted with
the transaction context obtained from the transaction manager. Standard
Jakarta EE components can also use such pools. Connections obtained by
non-component callers are not automatically closed at the end of a
transaction by the container. They must be explicitly closed by the
caller.
You can enable non-component callers in the following ways:
* Check the Allow Non Component Callers box on the Edit Connection Pool
Advanced Attributes page in the Administration Console. The default is
`false`. For more information, click the Help button in the
Administration Console.
* Specify the `--allownoncomponentcallers` option in the
`asadmin create-jdbc-connection-pool` command. For more information, see
the link:reference-manual.html#GSRFM[{productName} Reference Manual].
* Specify the `allow-non-component-callers` option in the `asadmin set`
command. For example:
+
[source]
----
asadmin set domain1.resources.jdbc-connection-pool.DerbyPool.allow-non-component-callers=true
----
For more information, see the link:reference-manual.html#GSRFM[{productName} Reference Manual].
* Create a JDBC resource with a `__pm` suffix.
Accessing a `DataSource` using the `Synchronization.beforeCompletion()`
method requires setting Allow Non Component Callers to `true`. For more
information about the Transaction Synchronization Registry, see
link:transaction-service.html#gaxit[The Transaction Manager, the
Transaction Synchronization Registry, and `UserTransaction`].
[[giydx]][[GSDVG00186]][[using-application-scoped-resources]]
=== Using Application-Scoped Resources
You can define an application-scoped database or other resource for an
enterprise application, web module, EJB module, connector module, or
application client module by supplying a `glassfish-resources.xml`
deployment descriptor file. For details, see
"link:application-deployment-guide/deploying-applications.html#GSDPG00075[Application-Scoped Resources]" in {productName} Application Deployment Guide.
[[geqvg]][[GSDVG00187]][[restrictions-and-optimizations]]
=== Restrictions and Optimizations
This section discusses restrictions and performance optimizations that
affect using the JDBC API.
[[geqvy]][[GSDVG00510]][[disabling-stored-procedure-creation-on-sybase]]
==== Disabling Stored Procedure Creation on Sybase
By default, DataDirect and Oracle JDBC drivers for Sybase databases
create a stored procedure for each parameterized `PreparedStatement`. On
the {productName}, exceptions are thrown when primary key identity
generation is attempted. To disable the creation of these stored
procedures, set the property `PrepareMethod=direct` for the JDBC
connection pool.