Monday, May 25, 2009

To overcome "Maximum open cursors exceeded" issue

When we execute a query in oracle, a ResultSet is created and stored in the memory. Oracle allows the programmer to access this ResultSet in the memory through cursors.

When we fire SELECT query / DML query from Java code, Oracle returns the reference of this created cursor to the Java program, which we refer as a ResultSet. Following is the hierarchy of creating objects in JDBC:



[For DML queries, we don't require "ResultSet" object]

Now, when we execute this query in loop for multiple records, we can use the same "Connection" object, but we'll have to close ResultSet object and Statement object at the end of each loop.

[Here we're using distributed database connection which means for each request, we create new "Connection" object and after the request is processed, we close this "Connection" object. Now, there might be the case that for one request, we need to fire multiple SELECT / DML queries, so we use the same "Connection" object to process this request.]



Closing ResultSet object and Statement object at the end of each loop will make sure that the cursors opened by executing this query will be closed / released.

[For DML queries, we need to close only "Statement" object].

Finally we close the connection object when we finish executing the queries in loop.



All the resources (including cursors) are released when the "Connection" object is closed.

Following this, we'll never encounter "Maximum open cursors exceeded" issue in any application :)

Wednesday, February 11, 2009

Maintaining and Managing variables stored in application's session

In one of our project, we were storing frequently used application related data into the session, but now as the project is growing incrementally, storing new data / modifying existing data into session has became very confusing and difficult to manage.

I was just thinking about the workaround for coming out of this havoc, and voila, I got one :). This workaround I've implemented in our project. I would like to share the idea which brought us out of this mess.

Idea (Workaround): We can use one singleton java class, which has one HashMap variable. There will be custom methods for getting, setting and removing (operations same as that of session operations) values from HashMap. Now we can use this implementation for storing data (which was supposed to be stored into the session) into the HashMap present in this class, and then we can put the object of this java class (we'll be having one object for each session) into the session. So, at the session level, there will be only one object present in the session, and now it's lot easy to maintain and manage session variables (now HashMap data). Also, there will be only two session operations in each class, first: getting this java class object from session, second: storing back this java class object back to the session.

Implementing this thing was really fun and gave us lot of flexibility to maintain and manage session variables... :)

Thursday, February 5, 2009

-C-O-N-C-E-P-T- Series : Java

Difference between using "" and toString() method for converting object value to String:

Case I - Using "":

-----------------------------------------------------------------
BigDecimal dec = new BigDecimal("1234567");
String str = "" + dec; // converting dec to String
System.out.println("str: "+str);

o/p:
str: 1234567
-----------------------------------------------------------------

-----------------------------------------------------------------
BigDecimal dec = null;
String str = "" + dec; // converting dec to String
System.out.println("str: "+str);

o/p:
str: null
-----------------------------------------------------------------


Case II - Using toString() method:

-----------------------------------------------------------------
BigDecimal dec = new BigDecimal("1234567");
String str = null;

if( dec!=null ) {
str = dec.toString(); // converting dec to String
}

System.out.println("str: "+str);

o/p:
str: 1234567
-----------------------------------------------------------------

-----------------------------------------------------------------
BigDecimal dec = null;
String str = null;

if( dec!=null ) {

str = dec.toString(); // converting dec to String
}

System.out.println("str: "+str);

o/p:
str: null
-----------------------------------------------------------------

In first case, we don't require null check, but doesn't has readability.
In second case, we require null check, but has readability.

Each one has its own ease of use.

Saturday, January 3, 2009

Custom Map Implementation in Java

Blogging after a long-long-long-... time :)

When we fetch records from HashMap, it gives records according to hash code, i.e. the records returned are not in the order when they're placed in the Map.

When we fetch records from TreeMap, it gives records in the sorted order of key, i.e. the records returned are not in the order when they're placed in the Map.

What I want was a Map that should return sequential values/objects that are put into when they're fetched. So, why not to make our own custom implementation of Map that does what is needed.

I constructed following Custom Map Implementation. Please find the code below:

CustomMapImpl.java



===
Supporting Class: CustomEntrySetImpl.java



===

Output of above program:

key1 : value1
key2 : value2
key4 : value4
key5 : value5
key6 : value6
key7 : value7

---

It was a very great experience. I also digged into the actual Java Map source code which was an amazing experience.


Wednesday, August 27, 2008

Using "synchronization" effectively

"Synchronization is anti-performance. So how can we use synchronization and still optimize on performance? So apply synchronization where it is absolutely necessary, or as minimum as possible."


We'll consider following two code snippets:

Scenario: Creating/accessing singleton object

Method level synchronization:



As you can see, the "synchronized" keyword is used at method level. So, now in multi-threaded environment, multiple threads accessing the getInstance() method will be queued-in. Following figure shows the scenario:



As shown in above figure, thread "t1" (the thread that is allowed to enter the getInstance() method first) will create the first object of "DemoClass" class and other threads will just get the reference of that singleton object which was created by thread "t1". Now this will definitely hamper the application's performance as every thread after "t1" will be queued-in, as there is no need after the singleton object is been created. So, we can use "synchronized" at block level which will reduce this performance bottle-neck. How, we'll see it soon :)

Block level synchronization:



As you can see, the "synchronized" keyword is used at block level. So, now in multi-threaded environment, multiple threads accessing the getInstance() method will NOT be queued-in. Following figure shows the scenario:



As shown in above figure, multiple threads can simultaneously access the getInstance() method. But, it can be that more than one threads can simultaneously hit the first "if statement". So, we can use "synchronized" keyword inside "if" such that those number of threads which are arrived parallel-ly can be queued-in. The second "if statement" makes sure that only one object is created as we're dealing with singleton class. Now, multiple threads can parallel-ly access the getInstance() method to get the reference of a singleton object. This removes the performance bottle-neck as mentioned in the above scenario.

Cool concept, isn't it :)

Thursday, July 31, 2008

Updating the state of a Singleton Object after specific interval of time

I've created a Singleton Object which holds some values which are fetched from the database table. Following are the class specs:

1) All setter methods are private
2) All getter methods are public
3) One configuration method that sets all the values in the related attributes of class using their private setters

The need was to update the state of this singleton object when there are any changes made in the configuration table in the database. But to achieve this, I need to restart the server each time when any changes has been made in the configuration table.

So I created one WatchDog class in a thread that continuously changes the state of a singleton configuration object after a specific interval of time, & this time interval in-turn is fetched dynamically from the same configuration table from the database :)

Tuesday, July 22, 2008

Some experience with Log4j

I was doing some basic practice programs which implements Log4j for logging. I was getting following warning message on the console. Here I was using PropertyConfigurator to configure Log4j using the log4j.properties file.



I found the description about the above warning on many of the technical forums which gave a reason that this warning occurs when the log4j.properties file has not been found by the program in the specified path.

But if that was the case, I purposely tried giving wrong file path to the same program, and whoa I got the following exception:



Later I found that there was a small spelling mistake in my log4j.properties file, due to which it was failing to initialize the log4j system. So, when I corrected that mistake & tried to run the program, I got the expected output :)

Thursday, July 3, 2008

-C-O-N-C-E-P-T- Series : Java

Synchronizing a static method and its effect in the multi-threading environment:

Since static code can modify only the static data, you will protect a static data with synchronized keyword. We know that static data and methods have only one copy for all the objects of that class. Therefore, you only need one lock per class to synchronize static methods. Object locks are not required for static methods. Static methods use a class lock for synchronization. This special lock is also an object lock.

Consider following java code:


Fig1


Fig2

Both the figure above are self explanatory, but I would like to elaborate more on Fig2. When we synchronize an instance method, the thread accessing that method acquires "Object Lock" on the object such that no other thread can access that method unless it completes its execution. Now for "synchronized static" method, it acquires "Class Lock" on that class. This class lock also implicitly has object lock, it's because as non-static methods can modify static variables, so we need to also put a lock on synchronized instance variables & this is internally done by the class lock.
Hence if one thread is executing a static synchronized method of a class then it holds a lock on all other synchronized methods of that class and in effect no other thread can call any of the synchronized static methods of that class until this current thread releases the lock.

This concept is really very interesting to learn :)

Stay tuned... :)

Thursday, June 26, 2008

-C-O-N-C-E-P-T- Series : Protocols for interfacing interactive web applications with web servers

In continuation with my previous post [here]

Following are different protocols for interfacing interactive web applications with web servers: SSI, CGI, SCGI, FastCGI, PHP, Java Servlet, JavaServer Pages, ASP, ASP .NET

(1) FastCGI
Web servers using this protocol: Nginx, Apache HTTP server (partial), Lighttpd (partial), etc.

(2) Java Servlet & JavaServer Pages
Web servers using this protocol: Apache Tomcat, WebLogic, WebSphere, etc.

(3) ASP & ASP .NET
Web server using this protocol: Microsoft IIS

Deployed static web application on "NGINX" HTTP server

NGINX which stands for "ENGINE X" is a light weight HTTP server which serves static content (normal HTML pages) efficiently. I was doing some R'n'D from yesterday and was successful in deploying my first Static Web Application on nginx server. Really it was a great experience.

There is some sort of small configuration which is need to be done in "nginx.conf" to navigate between the static pages. You just need to understand the basics of these entries and there you're with the running application on nginx server :)

Some useful pointers:
http://nginx.net
http://www.kevinworthington.com

Stay tuned... :)

Wednesday, June 25, 2008

-C-O-N-C-E-P-T- Series : Web / HTTP Server, Sevlet Container and Application Server

Static Web / HTTP server: It is responsible for handling HTTP requests and sending back static files as HTTP responses
Examples: Apache, lighttpd, nginx, Microsoft IIS, etc.

Servlet container: It handles HTTP requests but also add layers to process those requests, wrap them around Java objects that implement well defined interfaces and implement the servlet container architecture so that a java developer can easily use the API to respond to the requests, manage sessions, cookies, receive GET & POST params, and many more.
Examples: Apache Tomcat, etc.

Application server: It's more than the web server and servlet container. You can find lot of information here
Examples: JBoss, WebLogic, WebSphere, etc.

Tuesday, June 24, 2008

-C-O-N-C-E-P-T- Series : Java

Object's Shallow Copy and Deep Copy in Java:


Understanding concept:
Suppose I have following two objects:



Shallow copy: "obj2" refers to the memory block pointed by "obj1" as shown below.



Deep Copy: Here the data is actually copied over from "obj1" to "obj2" as shown below.



Java code:



(You can click on image to enlarge it)

Output:



Any comments are always welcome :)

Thursday, June 19, 2008

-C-O-N-C-E-P-T- Series : Java

Enhanced for loop:

Code snippet:




Output of the program is:
4
0
0
3
0




Here, "i" is directly assigned the each value from array in each iteration.
Iteration 1: Value of i = 1 (arr[0])
Iteration 2: Value of i = 2 (arr[1])
Iteration 3: Value of i = 3 (arr[2])
Iteration 4: Value of i = 4 (arr[3])



The above diagram is self-explanatory. Really interesting concept & worth learning :)

Wednesday, June 18, 2008

Implemented "SessionListener"

Blogging after a long time :)

Today I implemented Session Listener in our Project. Actually our requirement was to do certain database clean-up after the session time-out takes place. We could have called a Struts action when user clicks on Logout button, but the problem was - if the user closes the browser directly or forcefully closes the browser through Windows Task Manager, then how to call the clean-up code, so there was a need such that this code gets run by the server automatically after the session is about to time-out.

So I wrote a SessionListener class that implements HttpSessionListener. It's really a very cool concept that keeps track of each & every users' session. Even if you close the client browser, the required clean-up code will be fired automatically by the server itself & there you'll also have the access of that respective session data for that particular user :)


Any comments are always welcome :)

Friday, March 14, 2008

-C-O-N-C-E-P-T- Series : Javascript eval() Function

The eval() function executes a string as through it were a JavaScript statement.

Syntax: eval(string)

where string is any string representing a JavaScript expression, statement, or sequence of statements. The expression can include variables and properties of existing objects.

Description

The argument of the eval() function must be a string that can also be executed as a valid JavaScript statement. If the string represents an expression, eval() evaluates the expression. If the string is a numeric sring character, eval() returns the number. If the argument represents one or more JavaScript statements, eval() performs the statements.

Example

When executed, this script






displays this on the screen:

eval(string1) = 50

eval(executable) produces

Please feel free to correct me at any point :)


_________________________________________________________________________________________________________________

"Look at the sky. We are not alone. The whole Universe is friendly to us and conspires only to give the best to those who dream and work."

- Dr. A P J Abdul Kalam
_________________________________________________________________________________________________________________