| /* |
| * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0, |
| * or the Eclipse Distribution License v. 1.0 which is available at |
| * http://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause |
| */ |
| |
| // Contributors: |
| // Oracle - initial API and implementation from Oracle TopLink |
| package org.eclipse.persistence.sessions; |
| |
| import java.io.*; |
| import java.sql.Connection; |
| import org.eclipse.persistence.internal.databaseaccess.Accessor; |
| import org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor; |
| import org.eclipse.persistence.internal.databaseaccess.DatabaseCall; |
| import org.eclipse.persistence.internal.databaseaccess.Platform; |
| import org.eclipse.persistence.internal.localization.*; |
| import org.eclipse.persistence.platform.database.*; |
| import org.eclipse.persistence.platform.database.converters.StructConverter; |
| import org.eclipse.persistence.platform.database.partitioning.DataPartitioningCallback; |
| import org.eclipse.persistence.sequencing.NativeSequence; |
| import org.eclipse.persistence.exceptions.*; |
| |
| /** |
| * <p> |
| * <b>Purpose</b>: |
| * Hold the configuration information necessary to connect to a JDBC driver. |
| * <p> |
| * <b>Description</b>: |
| * A DatabaseLogin is used by an EclipseLink database session to connect to a |
| * JDBC server. |
| * <p> |
| * <b>Responsibilities</b>: |
| * <ul> |
| * <li> Hold the driver class name and URL header |
| * <li> Hold the database URL |
| * <li> Hold any driver-specific database connection properties (e.g. "user", "database") |
| * <li> Build the JDBC driver connect string |
| * <li> Hold the database platform (e.g. Oracle, DB2) |
| * <li> Hold the message logging stream |
| * <li> Hold other assorted configuration settings |
| * </ul> |
| */ |
| public class DatabaseLogin extends DatasourceLogin { |
| |
| /** |
| * Transaction isolation levels used in setTransactionIsolation(). |
| * These constants are from java.sql.Connection. |
| */ |
| /** Transactions are not supported. */ |
| public static final int TRANSACTION_NONE = Connection.TRANSACTION_NONE; |
| |
| /** Dirty reads, non-repeatable reads and phantom reads can occur. */ |
| public static final int TRANSACTION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED; |
| |
| /** Dirty reads are prevented; non-repeatable reads and phantom reads can occur. */ |
| public static final int TRANSACTION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED; |
| |
| /** Dirty reads and non-repeatable reads are prevented; phantom reads can occur. */ |
| public static final int TRANSACTION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ; |
| |
| /** Dirty reads, non-repeatable reads and phantom reads are prevented. */ |
| public static final int TRANSACTION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE; |
| |
| |
| /** Stores the value for the number of time EclipseLink will attempt to reconnect the connection on a comm failure |
| * in the case EclipseLink is attempting to retry a query. EclipseLink will retry a read query outside of a transaction |
| * if EclipseLink can determine that a communication error occurred with the database. |
| */ |
| protected int queryRetryAttemptCount; |
| |
| /** Stores the number of milliseconds that EclipseLink will wait between attempts to reconnect a DatabaseConnection |
| * in the case EclipseLink is attempting to retry a query. EclipseLink will retry a read query outside of a transaction |
| * if EclipseLink can determine that a communication error occurred with the database. |
| */ |
| protected int delayBetweenConnectionAttempts; |
| |
| /** |
| * On an SQL Exception EclipseLink will ping the database to determine |
| * if the connection used can continue to be used for queries. This should have no impact on applications |
| * unless the user is using pessimistic locking queries with 'no wait' or are using a query timeout feature. |
| * If that is the case and the application is experiencing a performance impact from the health check then |
| * this feature can be turned off. Turning this feature off will prevent EclipseLink from being able to |
| * retry queries in the case of database failure. |
| * By default (null) connection health is validate if the query does not have a timeout, and there is a ping string. |
| * Setting to true or false overrides this. |
| */ |
| protected Boolean connectionHealthValidatedOnError; |
| |
| /** |
| * PUBLIC: |
| * Create a new login. |
| */ |
| public DatabaseLogin() { |
| this(new DatabasePlatform()); |
| } |
| |
| /** |
| * ADVANCED: |
| * Create a new login for the given platform. |
| */ |
| public DatabaseLogin(DatabasePlatform databasePlatform) { |
| super(databasePlatform); |
| this.useDefaultDriverConnect(); |
| this.delayBetweenConnectionAttempts = 5000; |
| this.queryRetryAttemptCount = 3; |
| } |
| |
| /** |
| * ADVANCED: |
| * Set the database platform to be custom platform. |
| */ |
| public void usePlatform(DatabasePlatform platform) { |
| super.usePlatform(platform); |
| } |
| |
| /** |
| * ADVANCED: |
| * Add a StructConverter |
| * @see org.eclipse.persistence.platform.database.converters.StructConverter |
| */ |
| public void addStructConverter(StructConverter converter){ |
| getPlatform().addStructConverter(converter); |
| } |
| |
| /** |
| * PUBLIC: |
| * Bind all arguments to any SQL statement. |
| */ |
| public void bindAllParameters() { |
| setShouldBindAllParameters(true); |
| } |
| |
| /** |
| * INTERNAL: |
| * Build and return an appropriate Accessor. |
| * The default is a DatabaseAccessor. |
| */ |
| @Override |
| public Accessor buildAccessor() { |
| return new DatabaseAccessor(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Cache all prepared statements, this requires full parameter binding as well. |
| * @see #bindAllParameters() |
| */ |
| public void cacheAllStatements() { |
| setShouldCacheAllStatements(true); |
| } |
| |
| /** |
| * PUBLIC: |
| * Do not bind all arguments to any SQL statement. |
| */ |
| public void dontBindAllParameters() { |
| setShouldBindAllParameters(false); |
| } |
| |
| /** |
| * PUBLIC: |
| * Do not cache all prepared statements. |
| */ |
| public void dontCacheAllStatements() { |
| setShouldCacheAllStatements(false); |
| } |
| |
| /** |
| * PUBLIC: |
| * Disable driver level data conversion optimization. |
| * This can be disabled as some drivers perform data conversion themselves incorrectly. |
| */ |
| public void dontOptimizeDataConversion() { |
| setShouldOptimizeDataConversion(false); |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink can be configured to use batch writing. This facility allows multiple write operations to be |
| * submitted to a database for processing at once. Submitting multiple updates together, instead of |
| * individually, can greatly improve performance in some situations. |
| */ |
| public void dontUseBatchWriting() { |
| setUsesBatchWriting(false); |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink can be configured to use parameter binding for large binary data. |
| * By default EclipseLink will print this data as hex through the JDBC binary escape clause. |
| * Both binding and printing have various limits on all databases (e.g. 5k - 32k). |
| */ |
| public void dontUseByteArrayBinding() { |
| setUsesByteArrayBinding(false); |
| } |
| |
| /** |
| * PUBLIC: Indicate to EclipseLink that the JDBC driver does not support batch writing. |
| * This will revert to the default behavior which is to delegate to EclipseLink's |
| * internal batch writing. |
| * @see #useJDBCBatchWriting |
| * @see #setUsesJDBCBatchWriting(boolean usesJDBCBatchWriting) |
| */ |
| public void dontUseJDBCBatchWriting() { |
| setUsesJDBCBatchWriting(false); |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink can be configured to use database-specific SQL grammar, |
| * as opposed to the JDBC standard grammar. |
| * This is because, unfortunately, some drivers to not support the full JDBC standard. |
| * By default EclipseLink uses the JDBC SQL grammar. |
| */ |
| public void dontUseNativeSQL() { |
| setUsesNativeSQL(false); |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink can be configured to use streams to store large binary data. |
| */ |
| public void dontUseStreamsForBinding() { |
| setUsesStreamsForBinding(false); |
| } |
| |
| /** |
| * PUBLIC: |
| * Do not bind strings of any size. |
| */ |
| public void dontUseStringBinding() { |
| getPlatform().setStringBindingSize(0); |
| getPlatform().setUsesStringBinding(false); |
| } |
| |
| /** |
| * PUBLIC: |
| * Used for table creation. Most databases do not create an index automatically for |
| * foreign key columns. Normally it is recommended to index foreign key columns. |
| * This allows for foreign key indexes to be configured, by default foreign keys are not indexed. |
| * |
| * @return whether an index should be created explicitly for foreign key constraints |
| */ |
| public boolean shouldCreateIndicesOnForeignKeys() { |
| return getPlatform().shouldCreateIndicesOnForeignKeys(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Used for table creation. Most databases do not create an index automatically for |
| * foreign key columns. Normally it is recommended to index foreign key columns. |
| * This allows for foreign key indexes to be configured, by default foreign keys are not indexed. |
| */ |
| public void setShouldCreateIndicesOnForeignKeys(boolean shouldCreateIndicesOnForeignKeys) { |
| getPlatform().setShouldCreateIndicesOnForeignKeys(shouldCreateIndicesOnForeignKeys); |
| } |
| |
| /** |
| * INTERNAL: |
| * Return whether the specified driver is being used. |
| */ |
| protected boolean driverIs(String driverName) { |
| try { |
| return getDriverClassName().equals(driverName); |
| } catch (ValidationException e) { |
| // this exception will be thrown if we are using something other than a DefaultConnector |
| return false; |
| } |
| } |
| |
| /** |
| * PUBLIC: |
| * Return the JDBC connection string. |
| * This is a combination of the driver-specific URL header and the database URL. |
| */ |
| public String getConnectionString() throws ValidationException { |
| return getDefaultConnector().getConnectionString(); |
| } |
| |
| /** |
| * ADVANCED: |
| * Return the code for preparing cursored output |
| * parameters in a stored procedure |
| */ |
| public int getCursorCode() { |
| return getPlatform().getCursorCode(); |
| } |
| |
| /** |
| * PUBLIC: |
| * The database name is required when connecting to databases that support |
| * multiple databases within a single server instance (e.g. Sybase, SQL Server). |
| * This is ONLY used when connecting through ODBC type JDBC drivers. |
| * This is NEVER used with Oracle. |
| */ |
| public String getDatabaseName() { |
| return properties.getProperty("database"); |
| } |
| |
| /** |
| * PUBLIC: |
| * The database URL is the JDBC URL for the database server. |
| * The driver header is <i>not</i> be included in this URL |
| * (e.g. "dbase files"; not "jdbc:odbc:dbase files"). |
| */ |
| public String getDatabaseURL() { |
| if (!(getConnector() instanceof DefaultConnector)) { |
| return ""; |
| } |
| return getDefaultConnector().getDatabaseURL(); |
| } |
| |
| /** |
| * PUBLIC: |
| * The data source name is required if connecting through ODBC (JDBC-ODBC, etc.). |
| * This is the ODBC name given in the ODBC Data Source Administrator. |
| * This is just the database part of the URL. |
| */ |
| public String getDataSourceName() throws ValidationException { |
| return getDatabaseURL(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return the datasource platform specific information. |
| * This allows EclipseLink to configure certain advanced features for the datasource desired. |
| */ |
| @Override |
| public Platform getDatasourcePlatform() { |
| if (this.platform == null) { |
| this.platform = new DatabasePlatform(); |
| } |
| return platform; |
| } |
| |
| /** |
| * INTERNAL: |
| * Return the connector that will instantiate the java.sql.Connection. |
| */ |
| protected DefaultConnector getDefaultConnector() throws ValidationException { |
| try { |
| return (DefaultConnector)getConnector(); |
| } catch (ClassCastException e) { |
| throw ValidationException.invalidConnector(connector); |
| } |
| } |
| |
| /** |
| * PUBLIC: |
| * The driver class is the name of the Java class for the JDBC driver being used |
| * (e.g. "sun.jdbc.odbc.JdbcOdbcDriver"). |
| */ |
| public String getDriverClassName() { |
| if (!(getConnector() instanceof DefaultConnector)) { |
| return ""; |
| } |
| return getDefaultConnector().getDriverClassName(); |
| } |
| |
| /** |
| * PUBLIC: |
| * The driver URL header is the string predetermined by the JDBC driver to be |
| * part of the URL connection string, (e.g. "jdbc:odbc:"). |
| * This is required to connect to the database. |
| */ |
| public String getDriverURLHeader() { |
| if (!(getConnector() instanceof DefaultConnector)) { |
| return ""; |
| } |
| return getDefaultConnector().getDriverURLHeader(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Allow for the max batch writing size to be set. |
| * This allows for the batch size to be limited as most database have strict limits. |
| * If returns 0 then default size value is used. |
| * The size is in characters, the default is 32000 but the real value depends on the database configuration. |
| */ |
| public int getMaxBatchWritingSize() { |
| return getPlatform().getMaxBatchWritingSize(); |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink will attempt to test a connection if it encounters an exception on the connection |
| * when executing SQL. This attribute represents the SQL query that will be executed by EclipseLink. |
| * By default EclipseLink uses a query that should be correct for the specified platform but users |
| * may need or want to override that query. |
| */ |
| public String getPingSQL(){ |
| return getPlatform().getPingSQL(); |
| } |
| |
| |
| /** |
| * PUBLIC: |
| * Return the number of attempts EclipseLink should make to re-connect to a database and re-execute |
| * a query after a query has failed because of a communication issue. |
| * EclipseLink will only attempt to reconnect when EclipseLink can determine that a communication failure occurred |
| * on a read query executed outside of a transaction. By default EclipseLink will attempt to retry the |
| * query 3 times, by setting this value to 0 EclipseLink will not retry queries. |
| */ |
| public int getQueryRetryAttemptCount() { |
| return queryRetryAttemptCount; |
| } |
| |
| /** |
| * PUBLIC: |
| * The server name is the name of the database instance. |
| * This is ONLY required if using an ODBC JDBC driver |
| * and overriding the server name specified in the ODBC |
| * Data Source Administrator. |
| */ |
| public String getServerName() { |
| return properties.getProperty("server"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Used to help bean introspection. |
| */ |
| public boolean getShouldBindAllParameters() { |
| return shouldBindAllParameters(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Used to help bean introspection. |
| */ |
| public boolean getShouldCacheAllStatements() { |
| return shouldCacheAllStatements(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Used to help bean introspection. |
| */ |
| public boolean getShouldOptimizeDataConversion() { |
| return shouldOptimizeDataConversion(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Used to help bean introspection. |
| */ |
| public boolean getShouldTrimStrings() { |
| return shouldTrimStrings(); |
| } |
| |
| /** |
| * PUBLIC: |
| * If prepared statement caching is used, return the cache size. |
| * The default is 50. |
| */ |
| public int getStatementCacheSize() { |
| return getPlatform().getStatementCacheSize(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Used to help bean introspection. |
| */ |
| public int getStringBindingSize() { |
| return getPlatform().getStringBindingSize(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Get the String used on all table creation statements generated from the DefaultTableGenerator |
| * with a session using this project (DDL generation). This value will be appended to CreationSuffix strings |
| * stored on the DatabaseTable or TableDefinition. |
| */ |
| public String getTableCreationSuffix(){ |
| return getPlatform().getTableCreationSuffix(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return the transaction isolation setting for the connection. |
| * Return -1 if it has not been set. |
| */ |
| public int getTransactionIsolation() { |
| return getPlatform().getTransactionIsolation(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Used to help bean introspection. |
| */ |
| public boolean getUsesBinding() { |
| return shouldUseByteArrayBinding(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Used to help bean introspection. |
| */ |
| public boolean getUsesNativeSequencing() { |
| return shouldUseNativeSequencing(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Used to help bean introspection. |
| */ |
| public boolean getUsesNativeSQL() { |
| return shouldUseNativeSQL(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Used to help bean introspection. |
| */ |
| public boolean getUsesStreamsForBinding() { |
| return shouldUseStreamsForBinding(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Used to help bean introspection. |
| */ |
| public boolean getUsesStringBinding() { |
| return getPlatform().usesStringBinding(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Force EclipseLink to manually begin transactions instead of using autoCommit. |
| * Although autoCommit should be used, and work, under JDBC, |
| * some drivers (e.g. Sybase JConnect) |
| * do not correctly map autoCommit to transactions, so stored procedures |
| * may not work correctly. |
| * This property should only be used as a workaround for the |
| * Sybase JConnect transaction problem. |
| */ |
| public void handleTransactionsManuallyForSybaseJConnect() { |
| getPlatform().setSupportsAutoCommit(false); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return whether an Oracle JDBC driver is being used. |
| */ |
| public boolean isAnyOracleJDBCDriver() { |
| return oracleDriverIs("jdbc:oracle:"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return whether a Cloudscape JDBC driver is being used. |
| */ |
| public boolean isCloudscapeJDBCDriver() { |
| return driverIs("COM.cloudscape.core.JDBCDriver"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return whether an IBM DB2 native client JDBC driver is being used. |
| */ |
| public boolean isDB2JDBCDriver() { |
| return driverIs("COM.ibm.db2.jdbc.app.DB2Driver"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return whether an Intersolv SeqeLink JDBC driver is being used. |
| */ |
| public boolean isIntersolvSequeLinkDriver() { |
| return driverIs("intersolv.jdbc.sequelink.SequeLinkDriver"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return whether a Sybase JConnect JDBC driver is being used. |
| */ |
| public boolean isJConnectDriver() { |
| return driverIs("com.sybase.jdbc.SybDriver"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return whether a Borland JDBCConnect JDBC driver is being used. |
| */ |
| public boolean isJDBCConnectDriver() { |
| return driverIs("borland.jdbc.Bridge.LocalDriver"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return whether a Borland JDBCConnect JDBC driver is being used. |
| */ |
| public boolean isJDBCConnectRemoteDriver() { |
| return driverIs("borland.jdbc.Broker.RemoteDriver"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return whether a Sun/Merant JDBC-ODBC bridge driver is being used. |
| */ |
| public boolean isJDBCODBCBridge() { |
| return driverIs("sun.jdbc.odbc.JdbcOdbcDriver"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return whether an Oracle native 7.x OCI JDBC driver is being used. |
| */ |
| public boolean isOracle7JDBCDriver() { |
| return oracleDriverIs("jdbc:oracle:oci7:@"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return whether an Oracle 8.x native OCI JDBC driver is being used. |
| */ |
| public boolean isOracleJDBCDriver() { |
| return oracleDriverIs("jdbc:oracle:oci8:@"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return whether an Oracle thin JDBC driver is being used. |
| */ |
| public boolean isOracleServerJDBCDriver() { |
| return oracleDriverIs("jdbc:oracle:kprb:"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return whether an Oracle thin JDBC driver is being used. |
| */ |
| public boolean isOracleThinJDBCDriver() { |
| return oracleDriverIs("jdbc:oracle:thin:@"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return whether a WebLogic Oracle OCI JDBC driver is being used. |
| */ |
| public boolean isWebLogicOracleOCIDriver() { |
| return driverIs("weblogic.jdbc.oci.Driver"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return whether a WebLogic SQL Server dblib JDBC driver is being used. |
| */ |
| public boolean isWebLogicSQLServerDBLibDriver() { |
| return driverIs("weblogic.jdbc.dblib.Driver"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return whether a WebLogic SQL Server JDBC driver is being used. |
| */ |
| public boolean isWebLogicSQLServerDriver() { |
| return driverIs("weblogic.jdbc.mssqlserver4.Driver"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return whether a WebLogic Sybase dblib JDBC driver is being used. |
| */ |
| public boolean isWebLogicSybaseDBLibDriver() { |
| return driverIs("weblogic.jdbc.dblib.Driver"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return whether a WebLogic thin client JDBC driver is being used. |
| */ |
| public boolean isWebLogicThinClientDriver() { |
| return driverIs("weblogic.jdbc.t3Client.Driver"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return whether a WebLogic thin JDBC driver is being used. |
| */ |
| public boolean isWebLogicThinDriver() { |
| return driverIs("weblogic.jdbc.t3.Driver"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Enable driver level data conversion optimization. |
| * This can be disabled as some drivers perform data conversion themselves incorrectly. |
| */ |
| public void optimizeDataConversion() { |
| setShouldOptimizeDataConversion(true); |
| } |
| |
| /** |
| * INTERNAL: |
| * Return whether the specified Oracle JDBC driver is being used. |
| */ |
| protected boolean oracleDriverIs(String urlPrefix) { |
| try { |
| if (getDriverURLHeader().length() != 0) { |
| return getDriverURLHeader().indexOf(urlPrefix) != -1; |
| } else { |
| return getDatabaseURL().indexOf(urlPrefix) != -1; |
| } |
| } catch (ValidationException e) { |
| // this exception will be thrown if we are using something other than a DefaultConnector |
| return false; |
| } |
| } |
| |
| /** |
| * PUBLIC: |
| * Set the JDBC connection string. |
| * This is the full JDBC connect URL. Normally EclipseLink breaks this into two parts to |
| * allow for the driver header to be automatically set, however sometimes it is easier just to set the |
| * entire URL at once. |
| */ |
| public void setConnectionString(String url) throws ValidationException { |
| setDriverURLHeader(""); |
| setDatabaseURL(url); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set the JDBC URL. |
| * This is the full JDBC connect URL. Normally EclipseLink breaks this into two parts to |
| * allow for the driver header to be automatically set, however sometimes it is easier just to set the |
| * entire URL at once. |
| */ |
| public void setURL(String url) { |
| setDriverURLHeader(""); |
| setDatabaseURL(url); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return the JDBC URL. |
| * This is the full JDBC connect URL. Normally EclipseLink breaks this into two parts to |
| * allow for the driver header to be automatically set, however sometimes it is easier just to set the |
| * entire URL at once. |
| */ |
| public String getURL() { |
| return getConnectionString(); |
| } |
| |
| /** |
| * ADVANCED: |
| * Set the code for preparing cursored output |
| * parameters in a stored procedure |
| */ |
| public void setCursorCode(int cursorCode) { |
| getPlatform().setCursorCode(cursorCode); |
| } |
| |
| /** |
| * PUBLIC: |
| * The database name is required when connecting to databases that support |
| * multiple databases within a single server instance (e.g. Sybase, SQL Server). |
| * This is ONLY used when connecting through ODBC type JDBC drivers. |
| * This is NEVER used with Oracle. |
| */ |
| public void setDatabaseName(String databaseName) { |
| setProperty("database", databaseName); |
| } |
| |
| /** |
| * PUBLIC: |
| * The database URL is the JDBC URL for the database server. |
| * The driver header should <i>not</i> be included in this URL |
| * (e.g. "dbase files"; not "jdbc:odbc:dbase files"). |
| */ |
| public void setDatabaseURL(String databaseURL) throws ValidationException { |
| getDefaultConnector().setDatabaseURL(databaseURL); |
| } |
| |
| |
| /** |
| * PUBLIC: |
| * The data source name is required if connecting through ODBC (JDBC-ODBC, etc.). |
| * This is the ODBC name given in the ODBC Data Source Administrator. |
| * This is just the database part of the URL. |
| */ |
| public void setODBCDataSourceName(String dataSourceName) { |
| setDatabaseURL(dataSourceName); |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink will attempt to test a connection if it encounters an exception on the connection |
| * when executing SQL. This attribute represents the SQL query that will be executed by EclipseLink. |
| * By default EclipseLink uses a query that should be correct for the specified platform but users |
| * may need or want to override that query. |
| */ |
| public void setPingSQL(String pingSQL){ |
| getPlatform().setPingSQL(pingSQL); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set the number of attempts EclipseLink should make to re-connect to a database and re-execute |
| * a query after a query has failed because of a communication issue. |
| * EclipseLink will only attempt to reconnect when EclipseLink can determine that a communication failure occurred |
| * on a read query executed outside of a transaction. By default EclipseLink will attempt to retry the |
| * query 3 times, by setting this value to 0 EclipseLink will not retry queries. |
| */ |
| public void setQueryRetryAttemptCount(int queryRetryAttemptCount) { |
| this.queryRetryAttemptCount = queryRetryAttemptCount; |
| } |
| |
| /** |
| * PUBLIC: |
| * The default value to substitute for database NULLs can be configured |
| * on a per-class basis. |
| * Example: login.setDefaultNullValue(long.class, Long.valueOf(0)) |
| */ |
| @Override |
| public void setDefaultNullValue(Class<?> type, Object value) { |
| getPlatform().getConversionManager().setDefaultNullValue(type, value); |
| } |
| |
| /** |
| * PUBLIC: |
| * The driver class is the Java class for the JDBC driver to be used |
| * (e.g. sun.jdbc.odbc.JdbcOdbcDriver.class). |
| */ |
| public void setDriverClass(Class<?> driverClass) { |
| setDriverClassName(driverClass.getName()); |
| } |
| |
| /** |
| * PUBLIC: |
| * The name of the JDBC driver class to be used |
| * (e.g. "sun.jdbc.odbc.JdbcOdbcDriver"). |
| */ |
| public void setDriverClassName(String driverClassName) throws ValidationException { |
| getDefaultConnector().setDriverClassName(driverClassName); |
| } |
| |
| /** |
| * PUBLIC: |
| * The driver URL header is the string predetermined by the JDBC driver to be |
| * part of the URL connection string, (e.g. "jdbc:odbc:"). |
| * This is required to connect to the database. |
| */ |
| public void setDriverURLHeader(String driverURLHeader) throws ValidationException { |
| getDefaultConnector().setDriverURLHeader(driverURLHeader); |
| } |
| |
| /** |
| * PUBLIC: |
| * Allow for the max batch writing size to be set. |
| * This allows for the batch size to be limited as most database have strict limits. |
| * If set to 0 then default value is used. |
| * The size is in characters, the default is 32000 but the real value depends on the database configuration. |
| */ |
| public void setMaxBatchWritingSize(int maxBatchWritingSize) { |
| getPlatform().setMaxBatchWritingSize(maxBatchWritingSize); |
| } |
| |
| |
| /** |
| * PUBLIC: |
| * The server name is the name of the database instance. |
| * This is ONLY used when connecting through ODBC type JDBC drivers, |
| * and only if the data source does not specify it already. |
| */ |
| public void setServerName(String name) { |
| setProperty("server", name); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set whether to bind all arguments to any SQL statement. |
| */ |
| public void setShouldBindAllParameters(boolean shouldBindAllParameters) { |
| getPlatform().setShouldBindAllParameters(shouldBindAllParameters); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set whether prepared statements should be cached. |
| */ |
| public void setShouldCacheAllStatements(boolean shouldCacheAllStatements) { |
| getPlatform().setShouldCacheAllStatements(shouldCacheAllStatements); |
| } |
| |
| /** |
| * ADVANCED: |
| * This setting can be used if the application expects upper case |
| * but the database does not return consistent case (e.g. different databases). |
| */ |
| public void setShouldForceFieldNamesToUpperCase(boolean shouldForceFieldNamesToUpperCase) { |
| getPlatform().setShouldForceFieldNamesToUpperCase(shouldForceFieldNamesToUpperCase); |
| } |
| |
| /** |
| * ADVANCED: |
| * Allow for case in field names to be ignored as some databases are not case sensitive. |
| * When using custom this can be an issue if the fields in the descriptor have a different case. |
| */ |
| public static void setShouldIgnoreCaseOnFieldComparisons(boolean shouldIgnoreCaseOnFieldComparisons) { |
| DatabasePlatform.setShouldIgnoreCaseOnFieldComparisons(shouldIgnoreCaseOnFieldComparisons); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set whether driver level data conversion optimization is enabled. |
| * This can be disabled as some drivers perform data conversion themselves incorrectly. |
| */ |
| public void setShouldOptimizeDataConversion(boolean value) { |
| getPlatform().setShouldOptimizeDataConversion(value); |
| } |
| |
| /** |
| * PUBLIC: |
| * By default CHAR field values have trailing blanks trimmed, this can be configured. |
| */ |
| public void setShouldTrimStrings(boolean shouldTrimStrings) { |
| getPlatform().setShouldTrimStrings(shouldTrimStrings); |
| } |
| |
| /** |
| * PUBLIC: |
| * If prepared statement caching is used this configures the cache size. |
| * The default is 50. |
| */ |
| public void setStatementCacheSize(int size) { |
| getPlatform().setStatementCacheSize(size); |
| } |
| |
| /** |
| * PUBLIC: |
| * Used to help bean introspection. |
| */ |
| public void setStringBindingSize(int stringBindingSize) { |
| getPlatform().setStringBindingSize(stringBindingSize); |
| } |
| |
| /** |
| * PUBLIC: |
| * Get the String used on all table creation statements generated from the DefaultTableGenerator |
| * with a session using this project (DDL generation). This value will be appended to CreationSuffix strings |
| * stored on the DatabaseTable or TableDefinition. |
| * ie setTableCreationSuffix("engine=InnoDB"); |
| */ |
| public void setTableCreationSuffix(String tableCreationSuffix){ |
| this.getPlatform().setTableCreationSuffix(tableCreationSuffix); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set the default qualifier for all tables. |
| * This can be the creator of the table or database name the table exists on. |
| * This is required by some databases such as Oracle and DB2. |
| */ |
| @Override |
| public void setTableQualifier(String qualifier) { |
| getPlatform().setTableQualifier(qualifier); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set the transaction isolation setting for the connection. |
| * This is an optional setting. The default isolation level |
| * set on the database will apply if it is not set here. |
| * Use one of the TRANSACTION_* constants for valid input values. |
| * Note: This setting will only take effect upon connection. |
| */ |
| public void setTransactionIsolation(int isolationLevel) { |
| getPlatform().setTransactionIsolation(isolationLevel); |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink can be configured to use batch writing. This facility allows multiple write operations to be |
| * submitted to a database for processing at once. Submitting multiple updates together, instead of |
| * individually, can greatly improve performance in some situations. |
| */ |
| public void setUsesBatchWriting(boolean value) { |
| getPlatform().setUsesBatchWriting(value); |
| } |
| |
| |
| /** |
| * PUBLIC: |
| * EclipseLink can be configured to use parameter binding for large binary data. |
| * By default EclipseLink will print this data as hex through the JDBC binary excape clause. |
| * Both binding and printing have various limits on all databases (e.g. 5k - 32k). |
| */ |
| public void setUsesByteArrayBinding(boolean value) { |
| getPlatform().setUsesByteArrayBinding(value); |
| } |
| |
| /** |
| * PUBLIC: Calling this method with an argument of true indicates to EclipseLink that |
| * the JDBC driver supports batch writing. EclipseLink's internal batch writing is disabled.<p> |
| * Calling this method with an argument of false indicates to EclipseLink that the |
| * JDBC driver does not support batch writing. This will revert to the default |
| * behavior which is to delegate to EclipseLink's internal batch writing.</p> |
| * @param usesJDBCBatchWriting boolean true delegates batch writing to the |
| * JDBC driver and false delegates batch writing to EclipseLink. |
| */ |
| public void setUsesJDBCBatchWriting(boolean usesJDBCBatchWriting) { |
| getPlatform().setUsesJDBCBatchWriting(usesJDBCBatchWriting); |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink can be configured to use database specific sql grammar not JDBC specific. |
| * This is because unfortunately some bridges to not support the full JDBC standard. |
| * By default EclipseLink uses the JDBC sql grammar. |
| */ |
| public void setUsesNativeSQL(boolean value) { |
| getPlatform().setUsesNativeSQL(value); |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink can be configured to use streams to store large binary data. |
| * This can improve the max size for reading/writing on some JDBC drivers. |
| */ |
| public void setUsesStreamsForBinding(boolean value) { |
| getPlatform().setUsesStreamsForBinding(value); |
| } |
| |
| /** |
| * PUBLIC: |
| * Used to help bean introspection. |
| */ |
| public void setUsesStringBinding(boolean usesStringBindingSize) { |
| getPlatform().setUsesStringBinding(usesStringBindingSize); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return callback. |
| * Used to integrate with data partitioning in an external DataSource such as UCP. |
| */ |
| public DataPartitioningCallback getPartitioningCallback() { |
| return getPlatform().getPartitioningCallback(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set callback. |
| * Used to integrate with data partitioning in an external DataSource such as UCP. |
| */ |
| public void setPartitioningCallback(DataPartitioningCallback partitioningCallback) { |
| getPlatform().setPartitioningCallback(partitioningCallback); |
| } |
| |
| /** |
| * PUBLIC: |
| * Bind all arguments to any SQL statement. |
| */ |
| public boolean shouldBindAllParameters() { |
| return getPlatform().shouldBindAllParameters(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Cache all prepared statements, this requires full parameter binding as well. |
| */ |
| public boolean shouldCacheAllStatements() { |
| return getPlatform().shouldCacheAllStatements(); |
| } |
| |
| /** |
| * ADVANCED: |
| * Can be used if the app expects upper case but the database is not return consistent case, i.e. different databases. |
| */ |
| public boolean shouldForceFieldNamesToUpperCase() { |
| return getPlatform().shouldForceFieldNamesToUpperCase(); |
| } |
| |
| /** |
| * ADVANCED: |
| * Allow for case in field names to be ignored as some databases are not case sensitive. |
| * When using custom this can be an issue if the fields in the descriptor have a different case. |
| */ |
| public static boolean shouldIgnoreCaseOnFieldComparisons() { |
| return DatabasePlatform.shouldIgnoreCaseOnFieldComparisons(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Return if our driver level data conversion optimization is enabled. |
| * This can be disabled as some drivers perform data conversion themselves incorrectly. |
| */ |
| public boolean shouldOptimizeDataConversion() { |
| return getPlatform().shouldOptimizeDataConversion(); |
| } |
| |
| /** |
| * PUBLIC: |
| * By default CHAR field values have trailing blanks trimmed, this can be configured. |
| */ |
| public boolean shouldTrimStrings() { |
| return getPlatform().shouldTrimStrings(); |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink can be configured to use batch writing. This facility allows multiple write operations to be |
| * submitted to a database for processing at once. Submitting multiple updates together, instead of |
| * individually, can greatly improve performance in some situations. |
| */ |
| public boolean shouldUseBatchWriting() { |
| return getPlatform().usesBatchWriting(); |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink can be configured to use parameter binding for large binary data. |
| * By default EclipseLink will print this data as hex through the JDBC binary escape clause. |
| * Both binding and printing have various limits on all databases (e.g. 5k - 32k). |
| */ |
| public boolean shouldUseByteArrayBinding() { |
| return getPlatform().usesByteArrayBinding(); |
| } |
| |
| /** |
| * PUBLIC: Answers true if EclipseLink has JDBC batch writing enabled. |
| * This is the case if setUsesJDBCBatchWriting(true) has been called. |
| * @return boolean true if batch writing is delegated to the JDBC driver. |
| * Returns false if delegated to EclipseLink. |
| * @see #useJDBCBatchWriting |
| * @see #dontUseJDBCBatchWriting |
| * @see #setUsesJDBCBatchWriting(boolean usesJDBCBatchWriting) |
| */ |
| public boolean shouldUseJDBCBatchWriting() { |
| return getPlatform().usesJDBCBatchWriting(); |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink can be configured to use a sequence table |
| * or native sequencing to generate unique object IDs. |
| * Native sequencing uses the ID generation service provided by the database |
| * (e.g. SEQUENCE objects on Oracle and IDENTITY columns on Sybase). |
| * By default a sequence table is used. Using a sequence table is recommended |
| * as it supports preallocation. |
| * (Native sequencing on Sybase/SQL Server/Informix does not support preallocation. |
| * Preallocation can be supported on Oracle by setting the increment size of the |
| * SEQUENCE object to match the preallocation size.) |
| */ |
| public boolean shouldUseNativeSequencing() { |
| return getPlatform().getDefaultSequence() instanceof NativeSequence; |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink can be configured to use database-specific SQL grammar, |
| * as opposed to the JDBC standard grammar. |
| * This is because, unfortunately, some drivers to not support the full JDBC standard. |
| * By default EclipseLink uses the JDBC SQL grammar. |
| */ |
| public boolean shouldUseNativeSQL() { |
| return getPlatform().usesNativeSQL(); |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink can be configured to use streams to store large binary data. |
| */ |
| public boolean shouldUseStreamsForBinding() { |
| return getPlatform().usesStreamsForBinding(); |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink can be configured to bind large strings. |
| */ |
| public boolean shouldUseStringBinding() { |
| return getPlatform().usesStringBinding(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Print all of the connection information. |
| */ |
| @Override |
| public String toString() { |
| StringWriter stringWriter = new StringWriter(); |
| PrintWriter writer = new PrintWriter(stringWriter); |
| writer.println("DatabaseLogin("); |
| writer.println("\t" + ToStringLocalization.buildMessage("platform", null) + "=>" + getDatasourcePlatform()); |
| writer.println("\t" + ToStringLocalization.buildMessage("user_name", null) + "=> \"" + getUserName() + "\""); |
| writer.print("\t"); |
| getConnector().toString(writer); |
| if (getServerName() != null) { |
| writer.println("\t" + ToStringLocalization.buildMessage("server_name", null) + "=> \"" + getServerName() + "\""); |
| } |
| if (getDatabaseName() != null) { |
| writer.println("\t" + ToStringLocalization.buildMessage("database_name", null) + "=> \"" + getDatabaseName() + "\""); |
| } |
| writer.write(")"); |
| return stringWriter.toString(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set the database platform to be Access. |
| */ |
| public void useAccess() { |
| if (getPlatform().isAccess()) { |
| return; |
| } |
| |
| DatabasePlatform newPlatform = new AccessPlatform(); |
| getPlatform().copyInto(newPlatform); |
| setPlatform(newPlatform); |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink can be configured to use batch writing. This facility allows multiple write operations to be |
| * submitted to a database for processing at once. Submitting multiple updates together, instead of |
| * individually, can greatly improve performance in some situations. |
| */ |
| public void useBatchWriting() { |
| setUsesBatchWriting(true); |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink can be configured to use parameter binding for large binary data. |
| * By default EclipseLink will print this data as hex through the JDBC binary excape clause. |
| * Both binding and printing have various limits on all databases (e.g. 5k - 32k). |
| */ |
| public void useByteArrayBinding() { |
| setUsesByteArrayBinding(true); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set the database platform to be Cloudscape. |
| */ |
| public void useCloudscape() { |
| if (getPlatform().isCloudscape()) { |
| return; |
| } |
| |
| DatabasePlatform newPlatform = new CloudscapePlatform(); |
| getPlatform().copyInto(newPlatform); |
| setPlatform(newPlatform); |
| } |
| |
| public void useDerby() { |
| if (getPlatform().isDerby()) { |
| return; |
| } |
| |
| DatabasePlatform newPlatform = new DerbyPlatform(); |
| getPlatform().copyInto(newPlatform); |
| setPlatform(newPlatform); |
| } |
| |
| |
| /** |
| * PUBLIC: |
| * Use the Cloudscape JDBC driver. |
| */ |
| public void useCloudscapeDriver() { |
| useCloudscape(); |
| setDriverClassName("COM.cloudscape.core.JDBCDriver"); |
| setDriverURLHeader("jdbc:cloudscape:"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set the database platform to be DB2. |
| */ |
| public void useDB2() { |
| if (getPlatform().isDB2()) { |
| return; |
| } |
| |
| DatabasePlatform newPlatform = new DB2Platform(); |
| getPlatform().copyInto(newPlatform); |
| setPlatform(newPlatform); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the IBM DB2 native client interface. |
| */ |
| public void useDB2JDBCDriver() { |
| useDB2(); |
| setDriverClassName("COM.ibm.db2.jdbc.app.DB2Driver"); |
| setDriverURLHeader("jdbc:db2:"); |
| useStreamsForBinding();// Works best with IBM driver |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the IBM DB2 thin JDBC driver. |
| */ |
| public void useDB2NetJDBCDriver() { |
| useDB2(); |
| setDriverClassName("COM.ibm.db2.jdbc.net.DB2Driver"); |
| setDriverURLHeader("jdbc:db2:"); |
| useStreamsForBinding();// Works best with IBM driver |
| } |
| |
| /** |
| * PUBLIC: |
| * Set the database platform to be DBase. |
| */ |
| public void useDBase() { |
| if (getPlatform().isDBase()) { |
| return; |
| } |
| |
| DatabasePlatform newPlatform = new DBasePlatform(); |
| getPlatform().copyInto(newPlatform); |
| setPlatform(newPlatform); |
| } |
| |
| /** |
| * PUBLIC: |
| * Connect to the JDBC driver via DriverManager. |
| * @see #useDirectDriverConnect() |
| */ |
| public void useDefaultDriverConnect() { |
| setConnector(new DefaultConnector()); |
| } |
| |
| /** |
| * PUBLIC: |
| * Connect to the JDBC driver via DriverManager. |
| * @see #useDirectDriverConnect(String, String, String) |
| */ |
| public void useDefaultDriverConnect(String driverClassName, String driverURLHeader, String databaseURL) { |
| setConnector(new DefaultConnector(driverClassName, driverURLHeader, databaseURL)); |
| } |
| |
| /** |
| * PUBLIC: |
| * Some JDBC drivers don't support connecting correctly (via DriverManager), |
| * but do support connecting incorrectly (e.g. Castanet). |
| * @see #useDirectDriverConnect() |
| */ |
| public void useDirectDriverConnect() { |
| setConnector(new DirectConnector()); |
| } |
| |
| /** |
| * PUBLIC: |
| * Specify the J2EE DataSource name to connect to. |
| * Also enable external connection pooling. |
| * @see JNDIConnector |
| */ |
| public void useDataSource(String dataSource) { |
| setConnector(new JNDIConnector(dataSource)); |
| useExternalConnectionPooling(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Specify the J2EE JTA enabled DataSource name to connect to. |
| * Also enable external transaction control and connection pooling. |
| * @see JNDIConnector |
| */ |
| public void useJTADataSource(String dataSource) { |
| useDataSource(dataSource); |
| useExternalTransactionController(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Some JDBC drivers don't support connecting correctly (via DriverManager), |
| * but do support connecting incorrectly (e.g. Castanet). |
| * @see #useDefaultDriverConnect(String, String, String) |
| */ |
| public void useDirectDriverConnect(String driverClassName, String driverURLHeader, String databaseURL) { |
| setConnector(new DirectConnector(driverClassName, driverURLHeader, databaseURL)); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use external connection pooling, such as WebLogic's JTS driver. |
| * |
| * @see #dontUseExternalConnectionPooling() |
| * @see #shouldUseExternalConnectionPooling() |
| */ |
| @Override |
| public void useExternalConnectionPooling() { |
| setUsesExternalConnectionPooling(true); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use an external transaction controller such as a JTS service |
| * |
| * @see #dontUseExternalTransactionController() |
| * @see #shouldUseExternalTransactionController() |
| */ |
| @Override |
| public void useExternalTransactionController() { |
| setUsesExternalTransactionController(true); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the HSQL JDBC driver. |
| */ |
| public void useHSQL() { |
| if (getPlatform().isHSQL()) { |
| return; |
| } |
| |
| DatabasePlatform newPlatform = new HSQLPlatform(); |
| getPlatform().copyInto(newPlatform); |
| setPlatform(newPlatform); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the HSQL JDBC driver. |
| */ |
| public void useHSQLDriver() { |
| useHSQL(); |
| setDriverClassName("org.hsqldb.jdbcDriver"); |
| setDriverURLHeader("jdbc:hsqldb:"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the i-net SQL Server JDBC driver. |
| */ |
| public void useINetSQLServerDriver() { |
| setDriverClassName("com.inet.tds.TdsDriver"); |
| setDriverURLHeader("jdbc:inetdae:"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set the database platform to be Informix. |
| */ |
| public void useInformix() { |
| if (getPlatform().isInformix()) { |
| return; |
| } |
| |
| DatabasePlatform newPlatform = new InformixPlatform(); |
| getPlatform().copyInto(newPlatform); |
| setPlatform(newPlatform); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the Intersolv/Merant SequeLink JDBC driver. |
| */ |
| public void useIntersolvSequeLinkDriver() { |
| setDriverClassName("intersolv.jdbc.sequelink.SequeLinkDriver"); |
| setDriverURLHeader("jdbc:sequelink:"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the Sybase JConnect JDBC driver. |
| */ |
| public void useJConnect50Driver() { |
| useSybase(); |
| setDriverClassName("com.sybase.jdbc2.jdbc.SybDriver"); |
| setDriverURLHeader("jdbc:sybase:Tds:"); |
| // JConnect does not support the JDBC SQL grammar |
| useNativeSQL(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the Sybase JConnect JDBC driver. |
| */ |
| public void useJConnectDriver() { |
| useSybase(); |
| setDriverClassName("com.sybase.jdbc.SybDriver"); |
| setDriverURLHeader("jdbc:sybase:Tds:"); |
| // JConnect does not support the JDBC SQL grammar |
| useNativeSQL(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set the database platform to be JDBC. |
| */ |
| public void useJDBC() { |
| DatabasePlatform newPlatform = new DatabasePlatform(); |
| getPlatform().copyInto(newPlatform); |
| setPlatform(newPlatform); |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink support batch writing in both JDK 1.1 abd JDK 1.2. |
| * In JDK 1.2 either the batch support provided by the JDBC driver can be used, |
| * or EclipseLink's built-in support, this allow for this to be set. |
| * By default the driver is used in JDK 1.2. |
| * Some JDBC 2 drivers to not support batching, so this lets are own batching be used. |
| */ |
| public void useJDBCBatchWriting() { |
| setUsesJDBCBatchWriting(true); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the Borland JDBCConnect JDBC driver. |
| */ |
| public void useJDBCConnectDriver() { |
| setDriverClassName("borland.jdbc.Bridge.LocalDriver"); |
| setDriverURLHeader("jdbc:BorlandBridge:"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the Borland JDBCConnect JDBC driver. |
| */ |
| public void useJDBCConnectRemoteDriver() { |
| setDriverClassName("borland.jdbc.Broker.RemoteDriver"); |
| setDriverURLHeader("jdbc:BorlandBridge:"); |
| } |
| |
| /** |
| * PUBLIC: |
| * User the Sun/Merant JDBC-ODBC bridge driver. |
| */ |
| public void useJDBCODBCBridge() { |
| setDriverClassName("sun.jdbc.odbc.JdbcOdbcDriver"); |
| setDriverURLHeader("jdbc:odbc:"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set the database platform to be MySQL. |
| */ |
| public void useMySQL() { |
| if (getPlatform().isMySQL()) { |
| return; |
| } |
| |
| DatabasePlatform newPlatform = new MySQLPlatform(); |
| getPlatform().copyInto(newPlatform); |
| setPlatform(newPlatform); |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink can be configured to use a sequence table |
| * or native sequencing to generate unique object IDs. |
| * Native sequencing uses the ID generation service provided by the database |
| * (e.g. SEQUENCE objects on Oracle and IDENTITY columns on Sybase). |
| * By default a sequence table is used. Using a sequence table is recommended |
| * as it supports preallocation. |
| * (Native sequencing on Sybase/SQL Server/Informix does not support preallocation. |
| * Preallocation can be supported on Oracle by setting the increment size of the |
| * SEQUENCE object to match the preallocation size.) |
| */ |
| public void useNativeSequencing() { |
| if(!shouldUseNativeSequencing()) { |
| getPlatform().setDefaultSequence(new NativeSequence(getPlatform().getDefaultSequence().getName(), |
| getPlatform().getDefaultSequence().getPreallocationSize(), |
| getPlatform().getDefaultSequence().getInitialValue())); |
| } |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink can be configured to use database-specific SQL grammar, |
| * as opposed to the JDBC standard grammar. |
| * This is because, unfortunately, some drivers to not support the full JDBC standard. |
| * By default EclipseLink uses the JDBC SQL grammar. |
| */ |
| public void useNativeSQL() { |
| setUsesNativeSQL(true); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set the database platform to be Oracle. |
| */ |
| public void useOracle() { |
| if (getPlatform().isOracle()) { |
| return; |
| } |
| |
| DatabasePlatform newPlatform = new OraclePlatform(); |
| getPlatform().copyInto(newPlatform); |
| setPlatform(newPlatform); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the Oracle 7.x native OCI JDBC driver. |
| */ |
| public void useOracle7JDBCDriver() { |
| useOracle(); |
| setDriverClassName("oracle.jdbc.OracleDriver"); |
| setDriverURLHeader("jdbc:oracle:oci7:@"); |
| // Oracle works best with stream binding. |
| useByteArrayBinding(); |
| useStreamsForBinding(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the Oracle 8.x native OCI JDBC driver. |
| */ |
| public void useOracleJDBCDriver() { |
| useOracle(); |
| setDriverClassName("oracle.jdbc.OracleDriver"); |
| setDriverURLHeader("jdbc:oracle:oci8:@"); |
| // Oracle works best with stream binding. |
| useByteArrayBinding(); |
| useStreamsForBinding(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the Oracle server JDBC driver. |
| */ |
| public void useOracleServerJDBCDriver() { |
| useOracle(); |
| setDriverClassName("oracle.jdbc.OracleDriver"); |
| setDriverURLHeader("jdbc:oracle:kprb:"); |
| // Oracle works best with stream binding. |
| useByteArrayBinding(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the Oracle thin JDBC driver. |
| */ |
| public void useOracleThinJDBCDriver() { |
| useOracle(); |
| setDriverClassName("oracle.jdbc.OracleDriver"); |
| setDriverURLHeader("jdbc:oracle:thin:@"); |
| // Oracle works best with stream binding. |
| useByteArrayBinding(); |
| useStreamsForBinding(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set the database platform to be PointBase. |
| */ |
| public void usePointBase() { |
| if (getPlatform().isPointBase()) { |
| return; |
| } |
| |
| DatabasePlatform newPlatform = new PointBasePlatform(); |
| getPlatform().copyInto(newPlatform); |
| setPlatform(newPlatform); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the PointBase JDBC driver. |
| */ |
| public void usePointBaseDriver() { |
| usePointBase(); |
| setDriverClassName("com.pointbase.jdbc.jdbcUniversalDriver"); |
| setDriverURLHeader("jdbc:pointbase:"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set the database platform to be SQL Server. |
| */ |
| public void useSQLServer() { |
| if (getPlatform().isSQLServer()) { |
| return; |
| } |
| |
| DatabasePlatform newPlatform = new SQLServerPlatform(); |
| getPlatform().copyInto(newPlatform); |
| setPlatform(newPlatform); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set the database platform to be Symfoware. |
| */ |
| public void useSymfoware() { |
| if (getPlatform().isSymfoware()) { |
| return; |
| } |
| |
| DatabasePlatform newPlatform = new SymfowarePlatform(); |
| getPlatform().copyInto(newPlatform); |
| setPlatform(newPlatform); |
| } |
| |
| /** |
| * PUBLIC: |
| * EclipseLink can be configured to use streams to store large binary data. |
| */ |
| public void useStreamsForBinding() { |
| setUsesStreamsForBinding(true); |
| } |
| |
| /** |
| * PUBLIC: |
| * Bind strings larger than 255 characters. |
| */ |
| public void useStringBinding() { |
| this.useStringBinding(255); |
| } |
| |
| /** |
| * PUBLIC: |
| * Bind strings that are larger than the specified size. |
| * Strings that are smaller will not be bound. |
| */ |
| public void useStringBinding(int size) { |
| getPlatform().setStringBindingSize(size); |
| getPlatform().setUsesStringBinding(true); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set the database platform to be Sybase. |
| */ |
| public void useSybase() { |
| if (getPlatform().isSybase()) { |
| return; |
| } |
| |
| DatabasePlatform newPlatform = new SybasePlatform(); |
| getPlatform().copyInto(newPlatform); |
| setPlatform(newPlatform); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set the prepare cursor code to what the WebLogic |
| * Oracle OCI JDBC driver expects. |
| */ |
| public void useWebLogicDriverCursoredOutputCode() { |
| setCursorCode(1111); |
| } |
| |
| /** |
| * PUBLIC: |
| * Set a WebLogic JDBC connection pool (a pool must be defined for the entity beans that are to be deployed) |
| */ |
| public void useWebLogicJDBCConnectionPool(String poolName) { |
| setDriverClassName("weblogic.jdbc.jts.Driver"); |
| setConnectionString("jdbc:weblogic:jts:" + poolName); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the WebLogic Oracle OCI JDBC driver. |
| */ |
| public void useWebLogicOracleOCIDriver() { |
| useOracle(); |
| setDriverClassName("weblogic.jdbc.oci.Driver"); |
| setDriverURLHeader("jdbc:weblogic:oracle:"); |
| // WebLogic has a bug converting dates to strings, which our optimizations require. |
| dontOptimizeDataConversion(); |
| useWebLogicDriverCursoredOutputCode(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the WebLogic SQL Server dblib JDBC driver. |
| */ |
| public void useWebLogicSQLServerDBLibDriver() { |
| useSQLServer(); |
| setDriverClassName("weblogic.jdbc.dblib.Driver"); |
| setDriverURLHeader("jdbc:weblogic:mssqlserver:"); |
| // WebLogic has a bug converting dates to strings, which our optimizations require. |
| dontOptimizeDataConversion(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the WebLogic SQL Server JDBC driver. |
| */ |
| public void useWebLogicSQLServerDriver() { |
| useSQLServer(); |
| setDriverClassName("weblogic.jdbc.mssqlserver4.Driver"); |
| setDriverURLHeader("jdbc:weblogic:mssqlserver4:"); |
| // WebLogic has a bug converting dates to strings, which our optimizations require. |
| dontOptimizeDataConversion(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the WebLogic Sybase dblib JDBC driver. |
| */ |
| public void useWebLogicSybaseDBLibDriver() { |
| useSybase(); |
| setDriverClassName("weblogic.jdbc.dblib.Driver"); |
| setDriverURLHeader("jdbc:weblogic:sybase:"); |
| // WebLogic has a bug converting dates to strings, which our optimizations require. |
| dontOptimizeDataConversion(); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the WebLogic thin client JDBC driver. |
| */ |
| public void useWebLogicThinClientDriver() { |
| setDriverClassName("weblogic.jdbc.t3Client.Driver"); |
| setDriverURLHeader("jdbc:weblogic:t3Client:"); |
| } |
| |
| /** |
| * PUBLIC: |
| * Use the WebLogic thin JDBC driver. |
| */ |
| public void useWebLogicThinDriver() { |
| setDriverClassName("weblogic.jdbc.t3.Driver"); |
| setDriverURLHeader("jdbc:weblogic:t3:"); |
| } |
| /** |
| * PUBLIC: |
| * Returns the number of milliseconds that EclipseLink will wait between attempts to reconnect a DatabaseConnection |
| * in the case EclipseLink is attempting to retry a query, the default is 5000. EclipseLink will retry a read query outside of a transaction |
| * if EclipseLink can determine that a communication error occured with the database. |
| */ |
| public int getDelayBetweenConnectionAttempts() { |
| return delayBetweenConnectionAttempts; |
| } |
| |
| /** |
| * PUBLIC: |
| * Stores the number of milliseconds that EclipseLink will wait between attempts to reconnect a DatabaseConnection |
| * in the case EclipseLink is attempting to retry a query. EclipseLink will retry a read query outside of a transaction |
| * if EclipseLink can determine that a communication error occurred with the database. |
| */ |
| public void setDelayBetweenConnectionAttempts(int delayBetweenConnectionAttempts) { |
| this.delayBetweenConnectionAttempts = delayBetweenConnectionAttempts; |
| } |
| |
| /** |
| * INTERNAL: |
| * Validate if set, or no timeout. |
| */ |
| public boolean isConnectionHealthValidatedOnError(DatabaseCall call, DatabaseAccessor accessor) { |
| if (this.connectionHealthValidatedOnError == null) { |
| if (getPingSQL() != null){ |
| if (call == null || call.getQueryTimeout() == 0 || accessor.isPossibleFailure()){ |
| return true; |
| }else{ |
| accessor.setPossibleFailure(true); |
| } |
| } |
| return false; |
| } |
| return this.connectionHealthValidatedOnError; |
| } |
| |
| /** |
| * PUBLIC: |
| * On an SQL Exception EclipseLink will ping the database to determine |
| * if the connection used can continue to be used for queries. This should have no impact on applications |
| * unless the user is using pessimistic locking queries with 'no wait' or are using a query timeout feature. |
| * If that is the case and the application is experiencing a performance impact from the health check then |
| * this feature can be turned off. Turning this feature off will prevent EclipseLink from being able to |
| * retry queries in the case of database failure. |
| * By default (null) connection health is validate if the query does not have a timeout, and there is a ping string. |
| * Setting to true or false overrides this. |
| */ |
| @Override |
| public boolean isConnectionHealthValidatedOnError() { |
| if (this.connectionHealthValidatedOnError == null) { |
| return (getPingSQL() != null); |
| } |
| return this.connectionHealthValidatedOnError; |
| } |
| |
| /** |
| * PUBLIC: |
| * On an SQL Exception EclipseLink will ping the database to determine |
| * if the connection used can continue to be used for queries. This should have no impact on applications |
| * unless the user is using pessimistic locking queries with 'no wait' or are using a query timeout feature. |
| * If that is the case and the application is experiencing a performance impact from the health check then |
| * this feature can be turned off. Turning this feature off will prevent EclipseLink from being able to |
| * retry queries in the case of database failure. |
| * By default (null) connection health is validate if the query does not have a timeout, and there is a ping string. |
| * Setting to true or false overrides this. |
| */ |
| public void setConnectionHealthValidatedOnError(boolean isConnectionHealthValidatedOnError) { |
| this.connectionHealthValidatedOnError = isConnectionHealthValidatedOnError; |
| } |
| } |