View
247
Download
1
Category
Preview:
Citation preview
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
BestPracticesforSpeedingandScalingJavaApplicationsOracleDatabase18
Nirmala Sundarappa,PrincipalProductManagerKuassi Mensah, DirectorofProductManagement,JeanDeLavarene,DirectorofDevelopmentServerTechnologies,October5th,2017
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
SafeHarborStatementThefollowingisintended tooutline ourgeneralproductdirection. Itisintended forinformationpurposes only,andmaynotbe incorporatedintoanycontract.Itisnotacommitment todeliver anymaterial,code,orfunctionality,andshouldnotberelieduponinmakingpurchasingdecisions. Thedevelopment, release, andtimingofanyfeaturesorfunctionality described forOracle’sproductsremainsatthesolediscretion ofOracle.
3
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
ProgramAgenda
What’sNew?
SpeedingUpJavaapplications
ScalingtheJavaworkloads
Questions
1
2
3
4
4
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
ProgramAgenda
What’sNew?
SpeedingUpJavaapplications
ScalingtheJavaworkloads
Questions
1
2
3
4
5
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.
OracleDatabase18c
DB18relatedcapabilitieswillbeupdatedoncetheDatabase18cisreleased.Pleasestaytuned.
6
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
DatabaseDevelopment
DatabaseCloudServicesforEnterprise
Exadata CSDatabaseCSExpressCS
Highest availability, scalability andperformance
SMB&Departmental Applications
Enterprise Applications
OracleCloudInfra
CustomeratCloudChoices Exadata CloudMachineCloudMachine
100%compatiblefromentry-leveltothelargestmissioncriticaldataloads
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
JavaConnectivitytoDatabaseServicesonCloud
8
• OracleExadata ExpressService(EECS)– TCPSconnectionwithOraclewalletsorJKS
– Needclient_credentials.zipfromserviceconsole
• OracleDatabaseCloudService(DBCS)– TCPconnection– 1521needs tobeunblocked
• OracleDatabaseExadataCloudMachine(ExaCM)– TCPconnection– Everything ispre-setup
• OracleDatabaseCloudInfrastructure(OCI)– TCPconnection– Add1521tosecurity list
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
ProgramAgenda
What’sNew?
SpeedingUpJavaapplications
ScalingJavaapplications
Questions
2
1
3
4
9
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
BestPracticesforSpeedingUpJavaApplications• UseConnectionURLwithconnectiondescriptors• UseUniversalConnectionPool(UCP)• Tuneexcessivehardparsing• Tuneexcessivesoftparsing• Enforceresultsetcaching• UseLOBBestPractices
• UseArrayoperations(Fetch,DML)• UseJavaintheDatabase• UseNetworkcompressionoverWAN• UseMemorymanagementbestpractices• Lightweight ConnectionValidation
10
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
ConnectionURLwithConnectionDescriptors
11
OracleRACwithADG
alias=(DESCRIPTION=(CONNECT_TIMEOUT=90) (RETRY_COUNT=20)(RETRY_DELAY=3)
(TRANSPORT_CONNECT_TIMEOUT=3)(ADDRESS_LIST=
(LOAD_BALANCE=on)(ADDRESS=(PROTOCOL=TCP)(HOST=primary-scan)(PORT=1521)))
(ADDRESS_LIST=(LOAD_BALANCE=on)(ADDRESS=(PROTOCOL=TCP)(HOST=secondary-scan)(PORT=1521)))
(CONNECT_DATA=(SERVICE_NAME =gold-cloud)))
NorelianceonDNS
AutomaticRetries
ALWAYSuseaSERVICEthatisNOTDB/PDBname
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
ConnectionURL– BestPractices• AlwaysusethelatestversionofJDBCdriverandUCPagainstcurrentorearlierdatabaseversion• Donotmixuptheversionsofjars– Useojdbc8.jar,ucp.jar,andons.jar from12.2.0.1version
• Alwaysreturnconnectionstothepoolforstableconnectionusage,runtimebalancing,andplanneddraining
• ConnectionURLbestpractices– UseoneDESCRIPTIONandmorecancause longdelays– SetLOAD_BALANCE onperADDRESS_LISTtobalanceSCANs– DONOTUSERETRY_COUNT withoutRETRY_DELAY– DOnotuseEasyConnectURL– ithasnoHAcapabilities
12
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.
UniversalConnectionPool(UCP)
13
UCPProperties Description
setInitialPoolSize(),setMinPoolSize(),setMaxPoolSize()
Set poolsizebasedondatabaseserverresources(numberofcores)Eg:MaxPoolSize =(rdbms-cores *n)/sum (pools-per-mid-tier)
setTimoutCheckInterval(int)setTimeToLiveConnectionTimeout(),setAbandonConnectionTimeout(),setConnectionWaitTimeout(int)setInactiveConnectionTimeout(int)
SettheConnection Timeoutsufficiently highenough tosuitetheapplicationprofile.
setMaxStatements() EnableStatementCaching– BydefaultitisOFF
setFastConnectionFailoverEnabled(),setONSConfiguration()
For HighAvailabilityFeatures.Enabledbydefaultin12.2UCP
Thebestconfiguredconnectionpoolsresultinhigherthroughput
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
ExcessiveHardStatementParsing?
14
Hardparse:allsteps involvedincreatingaSQLstatement parsetreeMonitorhardparseswithAWR/ADDM
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
Tuneexcessivehardparsing• AvoidHardParsingusingPreparedStatement&BindVariables
Insteadof:String query = "SELECT EMPLOYEE_ID, LAST_NAME, SALARY FROM EMPLOYEES WHERE EMPLOYEE_ID = " + generateNumber(); prepStmt = connection.prepareStatement(query); resultSet = pstmt.executeQuery();
Changeto:String query = "SELECT EMPLOYEE_ID, LAST_NAME, SALARY FROM EMPLOYEES WHERE EMPLOYEE_ID = ?"; prepStmt = connection.prepareStatement(query);prepStmt.setInt(1, generateNumber()); resultSet = pstmt.executeQuery();
Fallback ifapplication cannotbechangedtousebindsinit.ora parameter:CURSOR_SHARING={FORCE|SIMILAR|EXACT}
15
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
Tuneexcessivesoftparsing• EnableStatementcaching– oracleDataSource.setImplicitCachingEnabled(true)
• Choosetherightcachesizetobestutilizethememory– connection.setStatementCacheSize(10)– Trytobeclosertothenumberofmostusedstatements– Defaultstatement cachesizeis10
• Fallback ifyoucannotchangetheapplicationtousestatementcaching– session_cached_cursors =50
16
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
EnforceresultsetcachingServersideresultsetcaching• Querynotre-executed (untilcacheinvalidated)
Clientsideresult-setcaching• Sharedacrossmultiple connections fromthesameDataSourceinthemiddletier
• Fasteraccess tofrequentlyqueried data• Transparent invalidation throughQueryChangeNotification
• Someofthebenchmarks showed3ximprovement
• Serversideconfiguration(init.ora)toenableResult SetCaching– CLIENT_RESULT_CACHE_SIZE– settoclientresultsetcachesize– CLIENT_RESULT_CACHE_LAG – Specifiesclientresultcachelaginminutes
17
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
UseLOBbestpractices• ConvertLOBtoLONGusingdefineColumnType(index,type,size)• TuneSessionDataUnit (SDU)forlargeLOBs,XML,largeResult sets– Max:2MB(12c),64K(11.2),32K(pre-11.2)
– Setonbothserverandclientside(SQLNet.ORA,TNSNAMES.ORAorURL)
– jdbc:oracle:thin:@(DESCRIPTION=(SDU=11280)(ADDRESS=(PROTOCOL=tcp)(HOST=myhost-vip)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=myorcldbservicename)))
– Improvesperformance,networkutilization,andmemoryconsumption• UsePreFetching forsmallLOBssetLobPrefetchsize()
• DataInterface– StreamlinedmechanismforwritingandreadingtheentireLOBcontentsusingthestandardJDBCmethodsgetString()andsetBytes()
18
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
UseSecureFiles LOBs• Largereads/writes– BASICLOBs:internalbuffercopyareexpensive– SECUREFILELOBS:”oracle.net.useZeroCopyIO” or“Vectoredi/omechanism”
• Transparenttoexisting APIs– Usepublic boolean isSecureFile() throws SQLException tocheckwhetherornotyour BLOB or CLOB datausesOracleSecureFile storage
• Compression, encryption,deduplication
19
setupSecureFile()
Blob.getBytes()
Fetch/StreamLOBdatadirectly(bypassinternalbuffer)
ResultSet
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
ArrayDML/Fetching/Prefetching
• Usearrayoperationsinsteadofsinglerowoperations– SinglerowDMLs/fetches incurexcessive roundtrips– Default fetchsizeis10
• Checkifarraysizeislargeenough• Somedriverssupportprefetchinginsteadofarrayfetching
20
BestPractices
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
ArrayFetchinginJavaString query = "SELECT EMPLOYEE_ID, LAST_NAME FROM EMPLOYEES ”
+" WHERE EMPLOYEE_ID > ? ”+" ORDER BY EMPLOYEE_ID”;
pstmt = connection.prepareStatement(query);pstmt.setInt(1, generateNumber());pstmt.setFetchSize(20);rs = pstmt.executeQuery();ResultSetMetaData rsmd = rs.getMetaData();int columnCount = rsmd.getColumnCount();while (rs.next()) {for(int i = 1; i <= columnCount; ++i)
System.out.println(rsmd.getColumnName(i) +”+rsmd.getColumnTypeName(i) +"]: "+rs.getString(i));
}
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
ArrayDMLinJavaString dml = "UPDATE EMPLOYEES SET SALARY = ?”
+" WHERE EMPLOYEE_ID = ?”;pstmt = connection.prepareStatement(dml);for(int i = 0; i < NUM_ROWS_TO_INSERT; ++i) {
int empId = getEmployeeId(employeeIdList);pstmt.setInt(1, getNewSalary(empId));pstmt.setInt(2, empId);pstmt.addBatch();
}
pstmt.sendBatch();
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
Client-sideJavaDatabaseAccess
23
JDBCSQL
SQL
SQL
•Multiple NetworkexchangeforprocessingeachSQLstatements
• Could leadtohighlatency in WANorCloudenvironments
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
JavaintheDatabase
24
JDBC(internal)SQL
SQL
SQLSQL
• Onecall fortheentireprocedure
• Lownetworklatencyin WANorCloudenvironments
• CanbeconsumedbySQL,PL/SQLoranyclient
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
NetworkCompressionOverWANMixedData
25
• Query:Select *fromTable;
• Data:Five columns50bytes perrow1million rows
• ArraySize:5000
• ConnectionProperty:oracle.net.networkCompression=”on”
• ReducesthesizeofSDUtransmittedacrossthenetwork 0
10
20
30
40
50
60
70
580 100 50 10
Tim
e (s
ec)
Bandwidth (Mbps)
OFFLOWHIGH
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
MemoryManagementTips• Memoryissueiscausedduetothebuffersusedtostorequeryresults–MoredynamicbuffermechanismandreturnbufferstothecachewhentheResultSetisclosed
– CREATE TABLE TAB(IDNUMBER(10), NAMEVARCHAR2(40),DOBDATE)ResultSet r=stmt.executeQuery(“SELECT ID,NAME,DOBFROMTAB”);
• Managethememoryusedbybuffers– FormQueries carefully(Retrievecolumnsexplicitlyandavoidselect*fromemployees)– Setthefetchsize carefully(avoidsettinghighersetFectchSize(10000))
• UsePreparedStatements andenableImplicitStatementCaches• ControlthememoryheapofJVMusing–Xmx or–Xms
26
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
ProgramAgenda
What’sNew?
SpeedingUpJavaApplications
ScalingJavaApplications
Questions
3
1
2
4
27
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
ScalingJavaApplications• UsingServerSideConnectionPool(DRCP)• HorizontallyScalingJavaWorkload• UsingRuntimeLoadBalancing(RLB)
28
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.| 29
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
UsingServersideconnectionPool(DRCP)• DRCPistheserversideconnectionpoolsharedacrossmanymid-tiers• EnablingDRCPontheserverside– dbms_connection_pool.start_pool();
• ChangetheconnectionURLtoenableDRCP– Eg:,jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(HOST=myhost)(PORT=1521)(PROTOCOL=tcp))(CONNECT_DATA=(SERVICE_NAME=myorcldbservicename))(SERVER=POOLED)))”;
• DRCPTagging– Associateaconnectiontoamid-tierwithaparticulartagnametoretrieveaspecificsessioneasily.–Enableusingthepropertyoracle.jdbc.UseDRCPMultipletag = true
30
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
HorizontalScalingJavaWorkloads
31
SHARD A SHARDB SHARD C
SharedConnection
Pool
SingleUnsharded Database
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
ScalingJavaapplications• SessionbasedShardingviaShardingKey• ShardingAPIs– JDBC/UCP• UCPasaShardDirector
32
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
CoordinatorDB
ApplicationTier
RoutingTier
DatabaseTier
33
Session-BasedRoutingviaShardingKey
ShardingKey: Apartitioning keyforasharded table.- E.g:custid- shard keyused forpartitioning thetable‘customers’.
SuperShardingKey:Required incaseofcomposite sharding.
ShardDirector:Looksupsharding keyandredirectstorightshardcontainingthedata.
ApplicationServer
ShardDirector
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
Sharding APIs:JDBC/UCP
// Sharding Key is a compound key of 2 sub-keysOracleShardingKey shardingKey =
dataSource.createShardingKeyBuilder() .subkey("Customer_EMAIL", oracle.jdbc.OracleType.VARCHAR2)
.subkey("1234", oracle.jdbc.OracleTypes.NUMBER)
.build();
// Super Sharding Key with only one sub-key
OracleShardingKey superShardingKey =dataSource.createShardingKeyBuilder()
.subkey("Customer_Location_US”,oracle.jdbc.OracleType.VARCHAR2)
.build();
34
BuildingSharding KeyandSuperSharding Key
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
OracleJDBCDriver
35
OracleUniversalConnectionPool(UCP)
JDBC/UCPconnectionwithaShardingKey
OracleDataSource ods = new OracleDataSource();
// Set connection properties
ods.setURL(DB_URL);ods.setUser("hr");ods.setPassword("****");// Get an Oracle JDBC connection for a shard
Connection conn = ods.createConnectionBuilder()
.shardingKey(shardingKey)
.superShardingKey(superShardingKey)
.build();
PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();// Set Connection Pool propertiespds.setURL(DB_URL);pds.setUser("hr"); pds.setPassword("****");pds.setInitialPoolSize(10);pds.setMinPoolSize(20);pds.setMaxPoolSize(30);// Get an UCP connection for a shard
Connection conn = pds.createConnectionBuilder()
.shardingKey(shardingKey)
.superShardingKey (superShardingKey)
.build();
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
GetconnectionShardkey=35
UCPLearningShardTopology§ During pool initialization (orwhen thepool connects tonewer
instances) theshard topology iscollected from various shard tocreateaShardRouting Table
UCP
Shard 1
1-- 10 Chunk 1 Shard 1
Shard 2
Shard 3
Shard 4
GSMlistener
Shard KeysRange ChunkName Shards
1-- 10 Chunk 1 Shard 1
10 -- 20 Chunk 2 Shard 21-- 10 Chunk 1 Shard 1
10 -- 20 Chunk 2 Shard 2
20 -- 30 Chunk 3 Shard 3
1-- 10 Chunk 1 Shard 1
10 -- 20 Chunk 2 Shard 2
20 -- 30 Chunk 3 Shard 3
30 -- 40 Chunk 4 Shard 4
GetconnectionShardkey=5GetconnectionShardkey=15
GetconnectionShardkey=25
36
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
UCPasaShardDirector• Once therequired topology iscollected byUCP, connectionrequests canbedirectly serviced bythepool without goingthrough theshard director.
• Basedontheshard keys provided intheconnection request, UCPcanlookup thecorresponding shard onwhich keys existandpooled connections totheshard canbeefficiently reused.
UCP
Shard 1
Shard KeysRange ChunkName Shards
1-- 10 Chunk 1 Shard 1
10 -- 20 Chunk 2 Shard 2
20 -- 30 Chunk 3 Shard 3
30– 40 Chunk 4 Shard 4
Shard 2
Shard 3
Shard 4
GSMListener
GetconnectionShardkey=16Getconnection
Shardkey=38
37
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
RuntimeLoadBalancing• LeverageLoadBalancingAdvisory– UsedtobalancetheworkacrosstheRACinstances. – Determine the instancethatoffersthebestperformance– Establish connections basedontheadvisory
• UCPusesRACLoadBalancingAdvisoryanddistributestheloadequallyamongtheinstances.• ServicegoalsmustbesettoSERVICE_TIMEorTHROUGHPUT– srvctl modifyservice-db <db_name> -service<service_name> -rlbgoalSERVICE_TIME -clbgoal SHORT
– srvctl modifyservice-db <db_name> -service <service_name> -rlbgoalTHROUGHPUT -clbgoal SHORT
38
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
ProgramAgendawithHighlight
What’sNew?
SpeedingUpJavaApplications
ScalingJavaApplications
Questions4
1
2
3
39
Copyright©2017, Oracleand/oritsaffiliates.Allrightsreserved.|
Whitepapersandotherresources• Performance,Scalability,andHigh-AvailabilitywithJDBCandUCPinOracleDatabase12cReleas1(12.2.0.1)• GithubCodesampleslocation• JDBC/UCPBlogsite• JDBC&UCPDownloadpage• JDBC&UCPLandingpageforotherresources
40
Recommended