{"id":13211,"date":"2020-11-30T00:24:37","date_gmt":"2020-11-30T05:24:37","guid":{"rendered":"https:\/\/www.eginnovations.com\/blog\/?p=13211"},"modified":"2024-09-20T02:47:19","modified_gmt":"2024-09-20T06:47:19","slug":"java-application-performance-tips","status":"publish","type":"post","link":"https:\/\/www.eginnovations.com\/blog\/java-application-performance-tips\/","title":{"rendered":"6 Tips to Enhance Java Application Performance by Tuning Java Database Accesses"},"content":{"rendered":"<div class=\"inner_content\">\n<h2 style=\"margin-bottom: 15px;\"><span class=\"ez-toc-section\" id=\"How_Java_Applications_Access_Databases\"><\/span>How Java Applications Access Databases?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p style=\"margin-bottom: 15px;\">Most modern enterprise applications are multi-tiered:<\/p>\n<ul>\n<li>One or more web front-ends balance requests across multiple servers for scalability.<\/li>\n<li>Middleware application servers host the business logic.<\/li>\n<li>The data resides in backend database servers and is accessed by application logic hosted on the application servers.<\/li>\n<li>The applications may also rely on external services \u2013 for authentication, for payment processing, shipping, and other such services.<\/li>\n<\/ul>\n<p>While tuning the performance of your application at the code level or sizing the JVM appropriately are important for enhancing performance, <strong>it is equally important to look at how to tune accesses to the backend database<\/strong>. After all, response time for a web request is dependent on the processing time in the Java application tier as well as the query processing time in the database tier.<\/p>\n<\/div>\n<div class=\"inner_content\">\n<table class=\"hand_table_style hand_table_style_one\" style=\"width: 100%;\">\n<tbody>\n<tr>\n<td>\n<div style=\"border-left: 0px solid #ffd392;\">\n<h3 style=\"margin: 10px 0; font-size: 24px;\"><span class=\"ez-toc-section\" id=\"Importance_of_Database_Performance_for_Java_Applications\"><\/span>Importance of Database Performance for Java Applications<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p style=\"margin-bottom: 15px;\">A JRebel <a style=\"color: inherit;\" href=\"https:\/\/www.jrebel.com\/blog\/java-performance-survey-results-2015\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">survey of the performance of Java applications<\/a> found that a huge proportion of Java application performance issues centered around the database:<\/p>\n<ul style=\"margin: 0px;\">\n<li><strong>54.8%<\/strong> of respondents reported <span style=\"font-family: Graphik-Medium; color: #f29306;\">slow database queries<\/span> as the root-cause of Java performance issues<\/li>\n<li><strong>38.6%<\/strong> of respondents encountered issues because their applications issued <span style=\"font-family: Graphik-Medium; color: #f29306;\">too many queries to the database<\/span><\/li>\n<\/ul>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>When they are called to troubleshoot application slowness, Java application developers often complain that \u2019It\u2019s the database\u2019 which is slow. Is this really the case, or could you have improved the way your application was written to get better performance when accessing the database server?<\/p>\n<p>In this blog, we recommend six tips that you can use to enhance Java application performance by tuning database accesses from your application. All of these are changes you can make in your application without requiring any special changes in the database server settings or additional configurations on the database server:<\/p>\n<div class=\"link_list_style\">\n<ol class=\"ol_style_line\">\n<li>1 <a href=\"#question1\" rel=\"question1\">Follow common JDBC best practices<\/a><\/li>\n<li>2 <a href=\"#question2\" rel=\"question2\">Use connection pools for database access<\/a><\/li>\n<li>3 <a href=\"#question3\" rel=\"question3\">Make sure to close database objects after use<\/a><\/li>\n<li>4 <a href=\"#question4\" rel=\"question4\">Choose the proper statement type to use in your Java application<\/a><\/li>\n<li>5 <a href=\"#question5\" rel=\"question5\">Make sure that your queries match indexes in the database<\/a><\/li>\n<li>6 <a href=\"#question6\" rel=\"question5\">Cache often used data<\/a><\/li>\n<\/ol>\n<\/div>\n<h3 id=\"question1\"><span class=\"ez-toc-section\" id=\"1_Follow_Common_JDBC_Best_Practices\"><\/span>1. Follow Common JDBC Best Practices<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<table class=\"hand_table_style\" style=\"width: 100%;\">\n<tbody>\n<tr>\n<td><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/09\/hand-symbol.png\" alt=\"hand-symbol\" width=\"48\" height=\"28\" border=\"0\" \/><\/td>\n<td>\n<div>\n<p style=\"margin-bottom:10px;\"><strong>What is JDBC? <\/strong><\/p>\n<p>JDBC stands for Java Database Connectivity, which is a standard Java API for database-independent interactions between the Java programming language and a wide range of databases. Queries could be selects, inserts, deletes, etc. Java applications use JDBC drivers to connect with the database server\/instance.<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>For best application performance, make sure you are following JDBC best practices, wherever possible, in your applications. There are several common best practices documented widely:<\/p>\n<ul>\n<li><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-13272\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/jdbc-java-application-driver.jpg\" alt=\"JDBC and Java Application relationship to the database\" width=\"318\" height=\"407\" border=\"0\" \/><strong>Make sure you are using the latest version of the database driver that is compatible with your JRE and database server:<\/strong> All Java applications use a database driver. A\u00a0JDBC driver\u00a0is a software component enabling a Java application to interact with a database. Depending on your database server type, there may be multiple choices for the JDBC driver. In such a case, use performance tests to determine which driver works best for your workload. At the same time, make sure that you are choosing the latest version of the database driver that is compatible with the JRE you are using and the database server version that is being accessed. Incompatibilities between the JDBC driver, the JRE, and the database server versions can impact application performance.<\/li>\n<li><strong>Use JDBC batch updates where possible<\/strong>: The JDBC API provides\u00a0an <em>addBatch()\u00a0<\/em>method to add\u00a0<a href=\"http:\/\/javarevisited.blogspot.sg\/2012\/07\/subquery-example-in-sql-correlated-vs.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">SQL queries<\/a> into a batch and\u00a0an <em>executeBatch()<\/em>\u00a0method to send batch queries for execution.JDBC batch updates can reduce the number of database roundtrips, which result in significant performance gain.<\/li>\n<li><strong>Disable auto-commit mode when not required:<\/strong> When you are running statements in a batch, it is better to disable the auto-commit mode of a connection. This enables you to <a href=\"http:\/\/javarevisited.blogspot.sg\/2011\/11\/database-transaction-tutorial-example.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">group SQL Statements in one transaction<\/a> and commit them. Otherwise, as auto-commit mode is turned on by default, every SQL statement runs in its own transaction and commits as soon as it finishes.<\/li>\n<li><strong>Use the NOLOCK hint or transaction isolation-level settings to enhance performance: <\/strong>Your application may have multiple users accessing it in parallel while also accessing URLs and causing queries to be issued to the database in parallel. If Microsoft SQL server is your database server, using the <a href=\"https:\/\/www.mssqltips.com\/sqlservertip\/2470\/understanding-the-sql-server-nolock-hint\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">NOLOCK hint<\/a> allows the database server to read data from tables by ignoring any locks, and therefore, not being blocked by other processes. This query also does not acquire any locks, and therefore, does not block other processes. If your application does not require strict synchronization across database reads and writes, you can set the NOLOCK hint in your queries. JDBC provides different <a href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/connect\/jdbc\/understanding-isolation-levels?view=sql-server-ver15\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">transaction isolation levels<\/a> that can be set at the database connection level. READ UNCOMMITTED is the transaction level, which provides for asynchronous read operations to the database.<\/li>\n<\/ul>\n<h3 id=\"question2\"><span class=\"ez-toc-section\" id=\"2_Use_Connection_Pools_for_Database_Access\"><\/span>2. Use Connection Pools for Database Access<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<table class=\"hand_table_style\" style=\"width: 100%;\">\n<tbody>\n<tr>\n<td><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/09\/hand-symbol.png\" width=\"48\" height=\"28\" border=\"0\" \/><\/td>\n<td>\n<div>\n<p style=\"margin-bottom:10px;\"><strong>What is a database connection pool?<\/strong><\/p>\n<p>A\u00a0connection pool\u00a0is a cache of\u00a0database connection\u00a0objects. The objects represent physical\u00a0database connections\u00a0that can be used by an application to\u00a0connect\u00a0to a\u00a0database. At run time, the application requests a\u00a0connection\u00a0from the\u00a0pool.<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>With connection pooling, connections\u00a0are reused (rather than being created) each time a\u00a0connection\u00a0is requested. The basic reason for having a database connection pool is that connection establishment is a time-consuming and expensive activity. If your database server is SSL-enabled, or uses Windows authentication, then it takes even more time to establish a connection. Here is a screenshot of eG Enterprise monitoring a Microsoft SQL database server. Notice that the time taken for connecting to this database server is 51 msecs but query execution time is only 1 msec. Establishing a connection and tearing it down can be more time-consuming and expensive than actually querying the database server. This is the issue that database connection pooling solves.<\/p>\n<div class=\"cpation_div\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-13274\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/sql-network.jpg\" alt=\"SQL Network Master Dashboard\" width=\"972\" height=\"277\" border=\"0\" \/><\/div>\n<p><center class=\"fontmedium\" style=\"font-size: 14px; margin-top: -15px; line-height: 22px;\"><em>Response time when connecting to a database server using JDBC.<br \/>\nNotice the connection time is 51 msecs and query execution takes only 1 msec.<\/em><\/center>A database connection pool facilitates\u00a0connection\u00a0reuse. A memory cache of\u00a0database connections, called a\u00a0connection pool, is maintained by a\u00a0connection pooling\u00a0module as a layer on top of any standard JDBC driver product. Applications can obtain connections from the pool, execute queries, and return the connection to the pool.<\/p>\n<div class=\"cpation_div\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-13268\" style=\"border-bottom: 1px solid #f4f4f4;\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/database-connection.jpg\" alt=\"The database connection pool facilitates connection reuse\" width=\"972\" height=\"274\" border=\"0\" \/><\/div>\n<p><center class=\"fontmedium\" style=\"font-size: 14px; margin-top: -15px; line-height: 22px;\"><em>Application client gets a connection from the already established connection pool.<br \/>\nThis reduces total response time.<\/em><\/center>For scalability, your Java application must use database connection pooling. Web containers, such as JBoss, Tomcat, WebLogic, WebSphere, etc., support connection pooling natively, which means you can make use of their connection-pooling capabilities rather than write your own connection-pooling module.<\/p>\n<p>Database connection pools have many configuration parameters. The initial pool size, the maximum pool size, the current pool size, the number of free and in-use connections in the pool are some of the key metrics to be tracked when monitoring database connection pools. For best performance, the database connection pool must be configured appropriately. For smaller workloads, keep the initial pool size as small as possible. If you are supporting a heavy workload and expect to see many connections in use, it is better to set the initial size to match the expected number of connections in use. Connection-pooling modules try to add new connections when required and remove them when they are not needed. Hence, setting the initial pool size to be as close to the number of connections you expect to need most of the time will give you the best performance.<\/p>\n<table class=\"hand_table_style \" style=\"width: 100%;\">\n<tbody>\n<tr>\n<td><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/09\/hand-symbol.png\" width=\"48\" height=\"28\" border=\"0\" \/><\/td>\n<td>\n<div>From a monitoring standpoint, track the usage of your database connection pool. If your usage ever gets close to 100%, it means you have not sized your connection pool adequately, or you have a connection leak in your application.<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><a href=\"https:\/\/www.eginnovations.com\/white-paper\/java-application-performance\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-19398\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/java-whitepaper.jpg\" alt=\"\" width=\"800\" height=\"200\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/java-whitepaper.jpg 800w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/java-whitepaper-300x75.jpg 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/java-whitepaper-768x192.jpg 768w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/java-whitepaper-310x78.jpg 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/java-whitepaper-140x35.jpg 140w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/p>\n<h3 id=\"question3\"><span class=\"ez-toc-section\" id=\"3_Make_Sure_to_Close_Database_Objects_After_Use\"><\/span>3. Make Sure to Close Database Objects After Use<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>There are different types of database objects that Java applications must deal with. After you establish a connection, you need to create a statement before you execute queries.<\/p>\n<p style=\"margin-bottom: 15px;\">There are three types of JDBC statements:<\/p>\n<ol>\n<li>Statement<\/li>\n<li>Prepared Statement, and<\/li>\n<li>Callable statement.<\/li>\n<\/ol>\n<p>While a statement is used to execute a static query, a prepared statement represents a precompiled SQL statement that can be executed multiple times.<\/p>\n<p>A callable statement is used to call a stored procedure with parameters. Once you have created a statement, you can execute a query. The results of a query are accessible to the application using ResultSets.<\/p>\n<div class=\"cpation_div\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-13271\" style=\"border-bottom: 1px solid #f4f4f4;\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/java-database-connection-sequence.jpg\" alt=\"Java database connection sequence\" width=\"972\" height=\"274\" border=\"0\" \/><\/div>\n<p><center class=\"fontmedium\" style=\"font-size: 14px; margin-top: -15px;\"><em>How applications use a database connection pool and objects<\/em><\/center><\/p>\n<div class=\"alignright divaligncaption\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-13276\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/statement-close.jpg\" alt=\"While you can write applications that use database objects, you must make sure that you explicitly close Statements and ResultSets when you no longer need them. \" width=\"395\" height=\"231\" border=\"0\" \/><center class=\"fontmedium\" style=\"font-size: 14px; margin-top: 10px;\"><em>Example of database objects not being closed after use. <\/em><\/center><\/div>\n<p>While you can write applications that use database objects, you must make sure that you explicitly close Statements and ResultSets when you no longer need them.<\/p>\n<p>In the example on the right, database resources are not closed after use. When objects remain unclosed while the application has moved on, the database server has not. It still has these objects available for use by the applications. These objects take up database server resources. As the database server has a finite amount of resources, if your applications keeps failing to close database objects repeatedly, it can slow down the database server and ultimately result in failures when another application or instance attempts to get a Connection, Statement, or a ResultSet.<\/p>\n<div class=\"alignleft divaligncaption \"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-13269\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/extend-auto-closeable.jpg\" alt=\"Extend Auto Closeable in JDK 7 and higher versions\" width=\"395\" height=\"231\" border=\"0\" \/><center class=\"fontmedium\" style=\"font-size: 14px; margin-top: 10px;\"><em>Using try-with-resources statement to automatically close database objects.<\/em><\/center><\/div>\n<p>Statements, ResultSets, and Connections extend\u00a0<em>AutoCloseable<\/em>\u00a0in JDK 7 and higher versions. If you declare a database resource in a\u00a0<em>try<\/em>-with-resources statement and there is an error that the code does not catch, the JRE will attempt to close the connection automatically. This is a foolproof way of avoiding database resource issues caused by your application logic.<\/p>\n<table class=\"hand_table_style \" style=\"width: 100%;\">\n<tbody>\n<tr>\n<td><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/09\/hand-symbol.png\" width=\"48\" height=\"28\" border=\"0\" \/><\/td>\n<td>\n<div>From a monitoring standpoint, track the connections to the database server. Also, monitor other database resources, such as cursor usage. If cursor usage reaches the maximum configured limit for the database server, applications accessing the database server will see errors. If your cursor usage suddenly grows, one or more applications using the database server may not be closing Statements or ResultSets.<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3 id=\"question4\"><span class=\"ez-toc-section\" id=\"4_Choose_the_Proper_Statement_Types_to_Use\"><\/span>4. Choose the Proper Statement Types to Use<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>As indicated, there are three types of statement objects that a Java developer can use.<\/p>\n<table class=\"hand_table_style\" style=\"width: 100%;\">\n<tbody>\n<tr>\n<td><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/09\/hand-symbol.png\" width=\"48\" height=\"28\" border=\"0\" \/><\/td>\n<td>\n<div style=\"font-family: 'Graphik-Regular';\">\n<p style=\"margin-bottom:10px;\"><strong>Statement vs. PreparedStatement<\/strong>:<\/p>\n<p> A Statement\u00a0is for executing a specific SQL\u00a0query and\u00a0it can&#8217;t accept input parameters.\u00a0A PreparedStatement\u00a0is used for executing a parameterized SQL\u00a0query\u00a0many times dynamically. Parameter values can be provided as inputs.<\/p><\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-13275\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/statement.jpg\" alt=\"\" width=\"395\" height=\"281\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/statement.jpg 395w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/statement-300x213.jpg 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/statement-310x221.jpg 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/statement-140x100.jpg 140w\" sizes=\"auto, (max-width: 395px) 100vw, 395px\" \/><\/p>\n<p style=\"margin-bottom: 15px;\">Using the right type of statement, objects can make a big difference in the performance of your application. Here are two examples:<\/p>\n<ul>\n<li>If you are executing a query that has pre-specified values and you are going to execute it once, you should be using \u201cStatement\u201d objects. Using a PreparedStatement in this case can be detrimental to performance. A prepared statement is optimized for repeated execution with different parameters. Therefore, some of the processing done when it is created is unnecessary, if it is going to be used once and that too without any parameters.<\/li>\n<\/ul>\n<table class=\"hand_table_style\" style=\"width: 100%;\">\n<tbody>\n<tr>\n<td><img loading=\"lazy\" decoding=\"async\" alt=\"time-synchronization-monitoring\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/06\/time-synchronization-monitoring.png\" width=\"96\" height=\"96\" border=\"0\" \/><\/td>\n<td>\n<div>\n<p>To validate this point, we constructed select queries against a table with 10 mil rows in a Microsoft SQL database. JTDS 1.3.1 was used as the JDBC driver. A select query using Statement took between 9 and 11 msecs whereas the same query issued using PreparedStatements took between 25 and 33 secs.<span style=\"font-family: Graphik-Medium;\"> That\u2019s a 3000-fold increase in response time seen by the user because the Java developer failed to use the proper Statement object!<\/span><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ul>\n<li>At the same time, if you must execute a similar query multiple times with different values, you should consider using PreparedStatements. A Statement object causes the query to be compiled each time. Hence, repeated executions of Statement objects will be much slower than the use of a PreparedStatement with different parameters.<\/li>\n<\/ul>\n<h3 id=\"question5\"><span class=\"ez-toc-section\" id=\"5_Make_Sure_that_Queries_Match_Indexes_in_the_Database\"><\/span>5. Make Sure that Queries Match Indexes in the Database<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-13267\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/avoid-full-table-scans.jpg\" alt=\"Avoid full table scans by using indexes\" width=\"395\" height=\"201\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/avoid-full-table-scans.jpg 395w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/avoid-full-table-scans-300x153.jpg 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/avoid-full-table-scans-310x158.jpg 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/avoid-full-table-scans-140x71.jpg 140w\" sizes=\"auto, (max-width: 395px) 100vw, 395px\" \/>When building queries, Java programmers are often interested in how to frame the query to get the desired results. Performance of the query is not a major concern initially. However, when the application is deployed in production, performance becomes an important consideration.<\/p>\n<p>When a query takes a long time, the response time seen by the user is high and this leads to reduced satisfaction and productivity. Hence, it is important that queries issued by a Java application to a database server are tuned for optimal performance. Tuning of a query involves making sure that the search criteria in the query matches one of the indexes associated with a table being queried in the database.<\/p>\n<table class=\"hand_table_style\" style=\"width: 100%;\">\n<tbody>\n<tr>\n<td><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/09\/hand-symbol.png\" width=\"48\" height=\"28\" border=\"0\" \/><\/td>\n<td>\n<div>\n<p style=\"margin-bottom:10px;\"><strong>What is a database index?<\/strong><\/p>\n<p>A\u00a0database index\u00a0is a\u00a0<a style=\"color: inherit;\" href=\"https:\/\/en.wikipedia.org\/wiki\/Data_structure\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">data structure<\/a>\u00a0that improves the speed of data retrieval operations in a\u00a0<a style=\"color: inherit;\" href=\"https:\/\/en.wikipedia.org\/wiki\/Table_(database)\">database table<\/a>\u00a0at the cost of additional writes and storage space to maintain the index data structure.<\/p>\n<p>Indexes are used to quickly locate data without having to search every row in a database table each time a database table is accessed.<\/p>\n<p>Indexes can be created using one or more\u00a0<a style=\"color: inherit;\" href=\"https:\/\/en.wikipedia.org\/wiki\/Column_(database)\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">columns of a database table<\/a>, providing the basis for both rapid random\u00a0<a style=\"color: inherit;\" href=\"https:\/\/en.wikipedia.org\/wiki\/Lookup\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">lookups<\/a>\u00a0and efficient access to ordered records. The whole point of having an index is to speed up search queries by essentially cutting down the number of records\/rows in a table that need to be examined.<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>When a Java application does not use an index of a table in the query being issued, it results in a full table scan in the database. A full table scan looks through\u00a0all\u00a0of the rows in a table\u2013one by one\u2013to find the data that a query is looking for. Obviously, this can cause very slow SQL queries, if you have a table with a lot of rows. Using an\u00a0<a href=\"https:\/\/www.programmerinterview.com\/index.php\/database-sql\/what-is-an-index\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">index<\/a>\u00a0helps prevent full table scans.<\/p>\n<p>To identify queries that are inefficient or slow, you can use <a href=\"https:\/\/www.eginnovations.com\/supported-technologies\/java-application-monitoring\">Java application performance monitoring tools<\/a>, such as <a href=\"https:\/\/www.eginnovations.com\/product\/application-performance-monitoring\">eG Enterprise<\/a>. Using bytecode instrumentation, eG Enterprise agents track all queries from your application to the database server and can highlight time-consuming queries, which are good targets for optimization.<\/p>\n<div class=\"cpation_div\"><a href=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/application-transaction-profiling-view.jpg\" data-rel=\"lightbox-image-0\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-13265\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/application-transaction-profiling.jpg\" alt=\"Application Transaction Profiling dashboard\" width=\"972\" height=\"490\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/application-transaction-profiling.jpg 972w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/application-transaction-profiling-300x151.jpg 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/application-transaction-profiling-800x403.jpg 800w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/application-transaction-profiling-310x156.jpg 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/application-transaction-profiling-140x71.jpg 140w\" sizes=\"auto, (max-width: 972px) 100vw, 972px\" \/><\/a><\/div>\n<p><center class=\"fontmedium\" style=\"font-size: 14px; margin-top: -15px;\"><em>Application transaction profiling to spot performance bottlenecks<\/em><\/center><\/p>\n<div class=\"cpation_div\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-13273\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/slow-query-identification.jpg\" alt=\"Drill down to highlight slow queries\" width=\"972\" height=\"389\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/slow-query-identification.jpg 972w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/slow-query-identification-300x120.jpg 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/slow-query-identification-800x320.jpg 800w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/slow-query-identification-310x124.jpg 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/slow-query-identification-140x56.jpg 140w\" sizes=\"auto, (max-width: 972px) 100vw, 972px\" \/><\/div>\n<p><center class=\"fontmedium\" style=\"font-size: 14px; margin-top: -15px;\"><em>Drilldown highlighting slow queries<\/em><\/center>Java application profiling can also highlight situations where your application is issuing too many queries to the database server. Even though the time taken by each query is less, the overall time spent in executing database queries could be a significant percentage of the user\u2019s perceived response time.<\/p>\n<p><a href=\"https:\/\/www.eginnovations.com\/product\/application-performance-monitoring\/free-trial\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-13270\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/java-bottom-banner.jpg\" alt=\"\" width=\"850\" height=\"160\" border=\"0\" srcset=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/java-bottom-banner.jpg 850w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/java-bottom-banner-300x56.jpg 300w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/java-bottom-banner-800x151.jpg 800w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/java-bottom-banner-310x58.jpg 310w, https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/java-bottom-banner-140x26.jpg 140w\" sizes=\"auto, (max-width: 850px) 100vw, 850px\" \/><\/a><\/p>\n<h3 id=\"question6\"><span class=\"ez-toc-section\" id=\"6_Cache_Often_Accessed_Data\"><\/span>6. Cache Often Accessed Data<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<table class=\"hand_table_style\" style=\"width: 100%;\">\n<tbody>\n<tr>\n<td><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/09\/hand-symbol.png\" width=\"48\" height=\"28\" border=\"0\" \/><\/td>\n<td>\n<div>\n<p style=\"margin-bottom:10px;\"><strong>What is caching?<\/strong><\/p>\n<p>A cache is a memory buffer used to temporarily store frequently accessed data. It improves performance as data does not have to be retrieved again from the original source.<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-13264\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/application-server-cluster.jpg\" alt=\"Application Server Cluster illustration\" width=\"395\" height=\"646\" border=\"0\" \/>If your application is often accessing a large table in the database and if the table is not expected to change much, consider caching the data wherever possible\u2013this can yield significant performance gains.<\/p>\n<p>There are different forms of caching you can adopt. You can employ \u201c<strong>in-process caching<\/strong>\u201d wherein key data from the database is stored in the application memory. For large-scale applications, you may need to adopt \u201c<strong>in-memory distributed caching<\/strong>\u201d (see <a href=\"https:\/\/dzone.com\/articles\/introducing-amp-assimilating-caching-quick-read-fo\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https:\/\/dzone.com\/articles\/introducing-amp-assimilating-caching-quick-read-fo<\/a>).<\/p>\n<p>There are many aspects you have to consider when implementing caching: when is data loaded, when is it updated, how much of the data can be in the cache, what is the eviction policy, how is concurrent access handled without introducing locks, etc.<\/p>\n<p>Open-source cache APIs, such as Google Guava or commercial products, such as Coherence, Ehcache, or Hazelcast can also be considered.<\/p>\n<table class=\"hand_table_style\" style=\"width: 100%;\">\n<tbody>\n<tr>\n<td><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/09\/hand-symbol.png\" width=\"48\" height=\"28\" border=\"0\" \/><\/td>\n<td>\n<div><strong>Note<\/strong>: Java application performance tuning is not just about JDBC access alone. Make sure that you are monitoring and tuning your <a href=\"https:\/\/www.eginnovations.com\/supported-technologies\/jvm-monitoring\">JVM threads<\/a>, heap memory configuration, garbage collection settings, etc.<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>In this blog, we have discussed six key areas regarding database access that Java developers must consider as they develop and optimize their applications for production deployment.<\/p>\n<p>At the same time, consider adding monitoring capabilities in your application (through log files, REST APIs, etc.). This can go a long way towards making your applications easier to manage and reduce the time that you spend in troubleshooting \u201cwhy is your application slow?\u201d.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>How Java Applications Access Databases? Most modern enterprise applications are multi-tiered: One or more web front-ends balance requests across multiple servers for scalability. Middleware application servers host the business logic. The data resides in backend database servers and is accessed by application logic hosted on the application servers. The applications may also rely on external [&hellip;]<\/p>\n","protected":false},"author":28,"featured_media":21290,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"_lmt_disableupdate":"no","_lmt_disable":"","footnotes":""},"categories":[27],"tags":[1182,441,440,1266,1152,979,171,500,1268,1260,1261,1259,1263,176,1267,177,1264,1262,1269,687,178,686,1348,1203,429,1265],"class_list":["post-13211","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java-monitoring","tag-appdynamics","tag-application-tuning","tag-database","tag-database-index","tag-datadog","tag-dynatrace","tag-java","tag-java-application","tag-java-connection-close","tag-java-connection-leak","tag-java-connection-pool","tag-java-database-query","tag-java-jdbc-performance","tag-java-monitoring","tag-java-optimization","tag-java-performance","tag-java-preparedstatement","tag-java-statement","tag-java-throughput","tag-java-tips","tag-java-tuning","tag-jdbc","tag-new-relic","tag-newrelic","tag-optimization","tag-using-database-indexes"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Java Database Performance Tuning<\/title>\n<meta name=\"description\" content=\"Learn best practices and tips to tune Java database accesses to enhance the performance of your Java applications.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.eginnovations.com\/blog\/java-application-performance-tips\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java Application Performance Tips and JDBC Tuning | eG Innovations\" \/>\n<meta property=\"og:description\" content=\"Most modern enterprise applications are multi-tiered. These Java application performance tips can help tune and monitor the JDBC Database to ensure top performance.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.eginnovations.com\/blog\/java-application-performance-tips\/\" \/>\n<meta property=\"og:site_name\" content=\"eG Innovations\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/eGInnovations\" \/>\n<meta property=\"article:published_time\" content=\"2020-11-30T05:24:37+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-20T06:47:19+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/JDBC-Database-fb.jpg\" \/>\n<meta name=\"author\" content=\"Abhilash Warrier\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Java Application Performance Tips and JDBC Tuning | eG Innovations\" \/>\n<meta name=\"twitter:description\" content=\"Most modern enterprise applications are multi-tiered. These Java application performance tips can help tune and monitor the JDBC Database to ensure top performance.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/JDBC-Database-fb.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/twitter.com\/PoetAbhilash\" \/>\n<meta name=\"twitter:site\" content=\"@eginnovations\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Abhilash Warrier\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutes\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Java Database Performance Tuning","description":"Learn best practices and tips to tune Java database accesses to enhance the performance of your Java applications.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.eginnovations.com\/blog\/java-application-performance-tips\/","og_locale":"en_US","og_type":"article","og_title":"Java Application Performance Tips and JDBC Tuning | eG Innovations","og_description":"Most modern enterprise applications are multi-tiered. These Java application performance tips can help tune and monitor the JDBC Database to ensure top performance.","og_url":"https:\/\/www.eginnovations.com\/blog\/java-application-performance-tips\/","og_site_name":"eG Innovations","article_publisher":"https:\/\/www.facebook.com\/eGInnovations","article_published_time":"2020-11-30T05:24:37+00:00","article_modified_time":"2024-09-20T06:47:19+00:00","og_image":[{"url":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/JDBC-Database-fb.jpg","type":"","width":"","height":""}],"author":"Abhilash Warrier","twitter_card":"summary_large_image","twitter_title":"Java Application Performance Tips and JDBC Tuning | eG Innovations","twitter_description":"Most modern enterprise applications are multi-tiered. These Java application performance tips can help tune and monitor the JDBC Database to ensure top performance.","twitter_image":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/JDBC-Database-fb.jpg","twitter_creator":"@https:\/\/twitter.com\/PoetAbhilash","twitter_site":"@eginnovations","twitter_misc":{"Written by":"Abhilash Warrier","Est. reading time":"17 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.eginnovations.com\/blog\/java-application-performance-tips\/#article","isPartOf":{"@id":"https:\/\/www.eginnovations.com\/blog\/java-application-performance-tips\/"},"author":{"name":"Abhilash Warrier","@id":"https:\/\/www.eginnovations.com\/blog\/#\/schema\/person\/3814c1ba0ca3fb4bb33acbb2989679af"},"headline":"6 Tips to Enhance Java Application Performance by Tuning Java Database Accesses","datePublished":"2020-11-30T05:24:37+00:00","dateModified":"2024-09-20T06:47:19+00:00","mainEntityOfPage":{"@id":"https:\/\/www.eginnovations.com\/blog\/java-application-performance-tips\/"},"wordCount":2617,"commentCount":0,"publisher":{"@id":"https:\/\/www.eginnovations.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.eginnovations.com\/blog\/java-application-performance-tips\/#primaryimage"},"thumbnailUrl":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/JDBC-Database-Thumbnail.jpg","keywords":["appdynamics","Application tuning","Database","database index","datadog","Dynatrace","Java","Java application","java connection close","java connection leak","java connection pool","java database query","java jdbc performance","Java Monitoring","java optimization","Java performance","java preparedStatement","java statement","java throughput","Java tips","Java Tuning","JDBC","new relic","NewRelic","Optimization","using database indexes"],"articleSection":["Java Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.eginnovations.com\/blog\/java-application-performance-tips\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.eginnovations.com\/blog\/java-application-performance-tips\/","url":"https:\/\/www.eginnovations.com\/blog\/java-application-performance-tips\/","name":"Java Database Performance Tuning","isPartOf":{"@id":"https:\/\/www.eginnovations.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.eginnovations.com\/blog\/java-application-performance-tips\/#primaryimage"},"image":{"@id":"https:\/\/www.eginnovations.com\/blog\/java-application-performance-tips\/#primaryimage"},"thumbnailUrl":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/JDBC-Database-Thumbnail.jpg","datePublished":"2020-11-30T05:24:37+00:00","dateModified":"2024-09-20T06:47:19+00:00","description":"Learn best practices and tips to tune Java database accesses to enhance the performance of your Java applications.","breadcrumb":{"@id":"https:\/\/www.eginnovations.com\/blog\/java-application-performance-tips\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.eginnovations.com\/blog\/java-application-performance-tips\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.eginnovations.com\/blog\/java-application-performance-tips\/#primaryimage","url":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/JDBC-Database-Thumbnail.jpg","contentUrl":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2020\/11\/JDBC-Database-Thumbnail.jpg","width":362,"height":235},{"@type":"BreadcrumbList","@id":"https:\/\/www.eginnovations.com\/blog\/java-application-performance-tips\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.eginnovations.com\/blog\/"},{"@type":"ListItem","position":2,"name":"6 Tips to Enhance Java Application Performance by Tuning Java Database Accesses"}]},{"@type":"WebSite","@id":"https:\/\/www.eginnovations.com\/blog\/#website","url":"https:\/\/www.eginnovations.com\/blog\/","name":"eG Innovations","description":"IT Performance Monitoring Insights","publisher":{"@id":"https:\/\/www.eginnovations.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.eginnovations.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.eginnovations.com\/blog\/#organization","name":"eG Innovations","alternateName":"eg innovations","url":"https:\/\/www.eginnovations.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.eginnovations.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2014\/07\/eg-logo-dark-gray1_new.jpg","contentUrl":"https:\/\/www.eginnovations.com\/blog\/wp-content\/uploads\/2014\/07\/eg-logo-dark-gray1_new.jpg","width":362,"height":235,"caption":"eG Innovations"},"image":{"@id":"https:\/\/www.eginnovations.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/eGInnovations","https:\/\/x.com\/eginnovations"]},{"@type":"Person","@id":"https:\/\/www.eginnovations.com\/blog\/#\/schema\/person\/3814c1ba0ca3fb4bb33acbb2989679af","name":"Abhilash Warrier","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.eginnovations.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dcaf620d284dd73c0cde0f986f69ad99?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dcaf620d284dd73c0cde0f986f69ad99?s=96&d=mm&r=g","caption":"Abhilash Warrier"},"sameAs":["https:\/\/x.com\/https:\/\/twitter.com\/PoetAbhilash"],"url":"https:\/\/www.eginnovations.com\/blog\/author\/abhilash-warriereginnovations-com\/"}]}},"modified_by":"eG Innovations","_links":{"self":[{"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/posts\/13211","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/users\/28"}],"replies":[{"embeddable":true,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/comments?post=13211"}],"version-history":[{"count":0,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/posts\/13211\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/media\/21290"}],"wp:attachment":[{"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/media?parent=13211"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/categories?post=13211"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.eginnovations.com\/blog\/wp-json\/wp\/v2\/tags?post=13211"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}