Search This Blog

Monday, 24 October 2016

hashCode and equals contract in java

public boolean equals(Object obj),public int hashCode() are methods of Object class.


Equals Demo Without Hashcode:
-----------------------------
import java.util.HashMap;

public class Emp{
private String name;

public Emp(String _name) {
name = _name;
}

public boolean equals(Object obj) {
if(obj==null) return false;
if (!(obj instanceof Emp))
return false;
if (obj == this)
return true;
return this.name.equals(((Emp) obj).name);
}
}

public class EqualsDemoWithoutHashcode {

public static void main(String[] args) {
Emp emp1 = new Emp("XYZ");
Emp emp2 = new Emp("ABC");

//HashMap stores Emp type and its salary
HashMap<Emp, Integer> m = new HashMap<Emp, Integer>();
m.put(emp1, 1000);
m.put(emp2, 20000);
System.out.println(m.get(new Emp("XYZ")));
}
}

In this case emp1 and emp2 hashcodes are different and equals also returned false as data different of the objects. And emp1 and emp2 are placed into hashmap. Here Object class hashcode function will be used to generate hash code. So while retrieving object from hashmap again it uses Object class hashcode function and it will not give any surety for user defined class objects to create same hash code for the object while retrieving. So if hash code is not same then it gives inconsistent data.


Similarly Suppose implemented hash code function and equals method not implemented. It will stores duplicate keys because it uses Object class equals method and it will not compare data of the object but it compares references. So references are not same so it stores duplicate keys.


HashMap stores internally data in table format and it uses hashcode function and equals method. To store objects in hashmap first it generates hash code and based on the hash code it stores in the bucket. Suppose same hash code is generated for two key objects then it uses equals method whether both key objects are same or different. If two key objects are different then it maintains multiple objects in the same bucket with same hash code.

Thursday, 13 October 2016

Proxy design pattern

Proxy design pattern

It is structural design pattern; It is place holder for original object and limits the access to it. This provides interface original object functionality to clients.This represents functionality of another class which is sensitive remote target object.
Client deals with Proxy class which delegates to the original object (target object).

Proxy class which holds the original object and provides interface and  delegates to the target.

Proxy Demo:

BankAccount.java
------------------------
class BankAccount {
int accountNo;
String name
                float amount;
String accountType;
String bankName;
String address;
int customerID;
           
              public BankAccount() {
accountNo = 1111111111111;
name = "abc"
                amount = 10000;
accountType = "Savings";
bankName = "XYZ Bank";
address = "D No-111 efgh street";
customerID = 12345;
}

public boolean withdraw(float _amount) {
boolean isWithdrawSuccess = false;
if (amount > 0 && amount >= _amount) {
amount -= _amount;
isWithdrawSuccess = true;
}
return isWithdrawSuccess;
}

public void deposit(float _amount) {
amount += _amount;
}
public int getAccountNo() {
return accountNo;
}

public void setAccountNo(int _accountNo) {
accountNo = _accountNo;
}

public String getName() {
return name;
}

public void setName(String _name) {
name =_name;
}

  public float getAmount() {
return amount;
}

public void setAmount(float _amount) {
amount = _amount;
}

public String getAccountType() {
return accountType;
}

public void setAccountType(String _accountType){
accountType= _accountType;
}

public String getBankName() {
return bankName;
}

public void setBankName(String _bankName) {
bankName = _bankName;
}

public String getAddress() {
return address;
}

public void setAddress(String _address) {
address = _address;
}

public int getCustomerID() {
return customerID;
}

public void setCustomerID(int _customerID) {
customerID =_customerID;
}

}

 interface OrderOperations {
  AccountDetails getAccountDetails();
  void  bookOrder(float orderAmount, String customerType);
  void unbookOrder(float orderAmount, String customerType);
}
AccountDetails.java
---------------------------
class AccountDetails {
String name;
float amount;
public String getName() {
return name;
}
public void setName(String _name) {
name =_name;
}
public float getAmount() {
return amount;
}
public void setAmount(float _amount) {
amount = _amount;
}

}
ProxyOrderOperationsImpl.java
-------------------------------------------
class ProxyOrderOperationsImpl implements OrderOperations {
BankAccount customerAccount;
ProxyOrderOperationsImpl() {
customerAccount = new BankAccount();
}

public AccountDetails getAccountDetails() {
AccountDetails  accountdetails = new AccountDetails();
System.out.println("***Account Details***");
System.out.println("Name:::" + customerAccount.getName());
accountdetails.setName(customerAccount.getName());
System.out.println("Amount:::" + customerAccount.getAmount());
accountdetails.setAmount(customerAccount.getAmount());
   return accountdetails;
}

public void  bookOrder(float orderAmount, String customerType) {
if (orderAmount > 5000) {
if("Regular".equalIgnoreCase(customerType)) {
orderAmount-=500;
} else {
orderAmount-=100;
}
}
boolean isBookOrder = customerAccount.withdraw(orderAmount);
if (isBookOrder) {
System.out.println("Order Booking is successful...");
} else {
System.out.println("Order Booking is un-successful...");
}

}
public void unbookOrder(float orderAmount, String customerType) {
        if (orderAmount > 5000) {
if("Regular".equalIgnoreCase(customerType)) {
orderAmount-=500;
} else {
orderAmount-=100;
}
        }
boolean isUnbookOrder = customerAccount.deposit(orderAmount);
if (isUnbookOrder ) {
System.out.println("Order Unbooking is successful...");
} else {
System.out.println("Order Unbooking is un-successful...");
}
}

}
PrxoyPatternDemo.java
--------------------------------
public PrxoyPatternDemo {
public static void main (String args[]) {
ProxyOrderOperationsImpl orderOperations = new ProxyOrderOperationsImpl();
orderOperations.getAccountDetails();
orderOperations.bookOrder(3000, "Regular");
orderOperations.unbookOrder(3000,"Regular");
}
}


Monday, 10 October 2016

Production issue analysis

Production issue analysis

Step 1: Try to reproduce issue in development environment, integration environment, and pre-production environment.

Step 2: If Production issue is not reproducible in above step, then we will get logs for production and we will analyse the logs to understand the issue; we will look is there any error message related to issue.

Step 3: We will see for "is there any differences in configuration between production and lower environment" and deployment version difference.

Step 4: if above three steps fails then we will  get production installed ear file or war file and we will deploy in lower environment and try to reproduce the issue.

Step 5: If above four steps fails then we will request for data-dump from production and we will load that into lower environments and try to reproduce the issue in lower environment.


Service locator design pattern

Service locator design pattern: 
It is used when we want to locate various services objects like JNDI. It caches the service objects. It looks first for service objects its cache. It access service object from its cache if it exists in cache otherwise  it lookup service object, it adds to its cache and returns service object.

Service - This is the actual service which process the request.

Service Locator - This is central point to get service object and it caches the services.

Cache - This holds references of services to reuse them.

Client - This calls the ServiceLocator and rceives the service object.

Servicelocator Demo:

BankService.java
-----------------------
public interface BankService {
 public String getServiceName();
 public boolean createAccount(CustmorInfo custInfo);
 public boolean deleteAccount(CustmorInfo custInfo);
}

AbcBankService.java
----------------------------
public class AbcBankService implements BankService {
public boolean createAccount(CustmorInfo custInfo){
boolean accountCreationStatus = false;
if (custInfo.getName()!= null) {
System.out.println("Account is created successfully in AbcBank");
accountCreationStatus = true;
}
retur accountCreationStatus;
}
public boolean deleteAccount(CustmorInfo custInfo) {
boolean accountDeletionStatus = false;
if (custInfo.getName()!= null) {
System.out.println("Account is delted successfully from AbcBank");
accountDeletionStatus = true;
}
retur accountDeletionStatus;
}
    @Override
public String getServiceName() {
    return "AbcBankService";
}
}

XyzBankService.java
----------------------------
public class XyzBankService implements BankService {
public boolean createAccount(CustmorInfo custInfo){
boolean accountCreationStatus = false;
if (custInfo.getName()!= null) {
System.out.println("Account is created successfully in XyzBank");
accountCreationStatus = true;
}
retur accountCreationStatus;
}
public boolean deleteAccount(CustmorInfo custInfo) {
boolean accountDeletionStatus = false;
if (custInfo.getName()!= null) {
System.out.println("Account is delted successfully from XyzBank");
accountDeletionStatus = true;
}
retur accountDeletionStatus;
}
    @Override
public String getServiceName() {
    return "AbcBankService";
}
}
CustmorInfo.java
------------------------
class CustmorInfo {
String name;
String address;
String accountType;

public setName(String _name) {
name = _name;
}
public String getName {
rturn name;
}
public void setAddress(String _address) {
address = _address;
}
public String getAddress() {
return address;
}
public void setAccountType(String _accountType) {
accountType = _accountType;
}
public String getAccountType() {
return accountType;
}
}

Cache.java
--------------
import java.util.ArrayList;
import java.util.List;
public class Cache {

  private List<BankService> services;
    public Cache(){    
services = new ArrayList<BankService>();
}
    public Service getService(String serviceName){
        for (BankService service : services) {
if(service.getServiceName().equalsIgnoreCase(serviceName)){
           System.out.println("Returning cached  " + serviceName + " object");
           return service;      
}    
}    
return null;
}
 
public void addService(BankService newService){    
boolean exists = false;          
for (BankService service : services) {      
if(service.getServiceName().equalsIgnoreCase(newService.getName())){          
exists = true;      
}    
}    
if(!exists){      
services.add(newService);    
}
}
}
ServiceLocator.java
--------------------------
public class ServiceLocator {
private static Cache cache;
    static {
     cache = new Cache();  
}
    public static Service getService(String serviceName){
      Service service = cache.getService(serviceName);
      if(service != null){      
return service;    
}
      //Make lookup calls to get service objects from JNDI  
Service service1 = BankServiceFactory.buildService(serviceName);
try {    
cache.addService(service1);
} catch (InvalidBankServiceException exception) {
System.out.println("Requested service is invalid" + exception);
}  
return service1;
}
}
BankServiceFactory.java
--------------------------------
class BankServiceFactory {
public static BankService buildService(serviceName) throws InvalidBankServiceException{
if ("AbcBankService".equalsIngnoreCase(serviceName)) {
return new AbcBankService();
} else if ("XyzBankService".equalsIngnoreCase(serviceName)) {
return new XyzBankService();
} else {
throw new InvalidBankServiceException("Requested bank service is invalid:::"+serviceName);
}

}
}

InvalidBankServiceException.java
---------------------------------------------
class InvalidBankServiceException{
InvalidBankServiceException(String s) {
     super(s);
}
}
ServiceLocatorDesignPatternDemo.java
----------------------------------------------------
public class ServiceLocatorDesignPatternDemo {
public static void main(String[] args) {    
Service service = ServiceLocator.getService("AbcBankService");
if (service != null) {    
service.createAccount();
}    
service = ServiceLocator.getService("XyzBankService");    
if (service != null) {    
service.createAccount();    
}
service = ServiceLocator.getService("AbcBankService");    
if (service != null) {    
service.deleteAccount();    
}
service = ServiceLocator.getService("XyzBankService");    
{
service.deleteAccount();  
}
}
}















Sunday, 9 October 2016

Singleton design pattern Demo

                                  Singleton design pattern Demo
Singleton pattern ensures that only one instance of the class exists in the java virtual machine.It provides a way to access instance of the class through factory method.

synchronized block - In multi thread environment; it gives access to single thread and it ensures that only one instance exists to class
final in class declaration - It will not allow to create subclass; privents inheritance
Colonable - need to override which should not allow to colone the object
Serializable - need to override readReslove method which should not create another object while desralizing object

final public class SingletonClass implements Cloneable, Serializable{
   
    private static SingletonClass myObj;
   
    //Private constructor
   
    private MySingletonClass(){
       
    }
   
    //A static method to get instance.
    public static MySingletonClass getInstance(){
synchronized {
                if(myObj == null){
     myObj = new SingletonClass();
}
        }
        return myObj;
    }
   
    // clone method overridding
    public Object clone() throws  CloneNotSupportedException{ 

return new CloneNotSupportedException("Clone Not Supported Exception.......");
    }
   
    public Object readResolve() {
      return SingletonClass.getInstance();
   }
   private void writeObject(ObjectOutputStream oos) {
      try {
      ----------------
      } catch (Exception e) {
         e.printStackTrace();
      }
   }

   private void readObject(ObjectInputStream ois) {
       try {
       ----------------
       } catch (Exception e) {
          e.printStackTrace();
       }
   }  

   @Override
   public String toString() {
      return "Singleton toString....";
   }
}

public class MySingletonDemo {
    public static void main(String a[]){
        MySingletonClass st = MySingletonClass.getInstance();
        ------------------------------
   }
}

Thursday, 6 October 2016

Publisher And Subscriber Thread example using wait, notify & sleep methods

Publisher And Subscriber Thread example using wait, notify & sleep methods


Message.java

import java.util.Date;
class Message {
 
       String message = null;
 
       Message() {
message = new Date().toString();
}
 
       public void setMessage(String msg) {
message = msg;
}

public String getMessage() {
return message;
}
}

Publisher.java
import java.util.Vector;
class Publisher extends Runnable {

  static final int SIZE = 5;
  private Vector<Message> messages = null;
 
public Publisher() {
 
 messages = new Vector<Message>();

 }

    public void run() {
        try {
            while (true) {
                putMsg();
                sleep(1000);
            }
        } catch (InterruptedException exception) {
System.out.prinln("(Thread Interrupted......");
        }
    }

    private synchronized void putMsg() throws InterruptedException {
        while (messages.size() == SIZE) {
            wait();
        }
 
        //To prepare real time message usually will call services
        messages.addElement(new Message());
        System.out.println("put msg");
        notify();
    }

    public synchronized String getMsg() throws InterruptedException {
        notify();
        while (messages.size() == 0) {
            wait();
        }
        String tempMessage = (String) messages.firstElement();
        messages.removeElement(tempMessage);
        return tempMessage;
    }
}

Subscriber.java
class Subscriber extends Runnable {

    Publisher publisher= null;

    Subscriber(Publisher p) {
        publisher = p;
    }


    public void run() {
        try {
            while (true) {
                String msg = publisher.getMsg();
                System.out.println("Consumed message........." + msg);
                sleep(500);
            }
        } catch (InterruptedException exception) {
            System.out.prinln("(Thread Interrupted......");
        }
    }
}

PublisherAndSubscriberDemo.java
public class PublisherAndSubscriberDemo {

public static void main(String args[]) {
        Thread publisherThread = new Publisher();
        publisherThread.start();
        Thread  subscriberThread = new Subscriber(publisherThread);
subscriberThread.start();
    }

}

Tuesday, 4 October 2016

Questions

Executor Frame Work in Java 1.6
Strategy Design Pattern in Java
 How many interfaces required to Builder Design pattern in Java
Capabilities of Jan-kins and had-son build tools

1.how to make object unmodifable of final class while creating immutable class
2. fail safe and fail fast and how concurrent hashmap handles if one thread accessing from same bucket and another
thread is removing/adding from same bucket
3. interface1 and interface2 same set of methods; what happens if class is going to implement both the interfces.
4.
Inter i1 = new Ineteger(10);
Inter i2 = new Ineteger(10);

i1 == i2                                            false

i1.equals(i2);                                   true

i1.equals("10");                               false

"10".equals(i1);                               false

Difference between HashSet and TreeSet:

HashSet: complexity to access element is O(1), it uses hashing algorithm to store values,and it will not give any guarantee to maintain sorted order  and it allows null objects.

TreeSet: complexity to access element is O(log n), it is uses tree structure algorithm to store values, it maintains data in sorted order and it will not allow null objects.

HashSet performance is more than TreeSet.


Maven command to execute micro service:

mvn clean install -DSkipTest=true & java -jar MicroService.jar

Friday, 17 October 2014

JQuery Colorbox Demo

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> New Document </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
  <style>
body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
h2{font-size:13px; margin:15px 0 0 0;}
</style>
<script src="js/jquery-1.8.1.js"></script>
<script src="js/jquery.colorbox.js"></script>
<link rel="stylesheet" href="js/colorbox.css" />
  <SCRIPT LANGUAGE="JavaScript">
  <!--
  $(document).ready(function () {
   jQuery('<div id="close" style="cursor: pointer; position: absolute; top: 0; right: 2px;"><img src="close.png" alt="close"/></div>').appendTo('#contentdiv');
$("#close").click(function() {
            jQuery('#cboxClose').click();
        });

$('#colrboxanchor').click(function () {
$("div#contentdiv").colorbox({
'href':'div#contentdiv',
'top':50,
'left':100,
'inline':true,
'width':400,
'height':400,
'opacity':0.3,
overlayClose:false,
'open':true,
onComplete: function() {
$(this).focus();
},
onClosed:function(){
                    $.colorbox.remove();
                }
});
});
  $('#btn').click(function () {
  alert("1111111111111");
  });
  });

    //-->
  </SCRIPT>
 </HEAD>

 <BODY>
 <div>
<div style="display:none">
<div id="contentdiv">
          <p>div content from request.<br/>welcome to colorbox<br/>It is lightweight jquery box(popup)</br></p>
</div>
</div>
<a  href="#" id="colrboxanchor">Click here to get colorbox popup</a>
<INPUT TYPE="button" id="btn" value="Click"/>
</div>
 </BODY>
</HTML>

Monday, 18 August 2014

Steps to Configure Tiles in Spring & Struts2 Applications



  Steps to Configure Tiles in Spring Application
  

Step 1: Add tiles Jars to lib folder
Step 2:  Create tiles.xml file

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE tiles-definitions PUBLIC
  "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
  "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">
<tiles-definitions>
    <definition name="baseLayout" template="/jsp/baselayout.jsp">
        <put name="title" value="" />
        <put name="header" value="/jsp/header.jsp" />
        <put name="leftPannel" value="/jsp/leftPannel.jsp" />
        <put name="body" value="" />
        <put name="footer" value="/jsp/footer.jsp" />
    </definition>
    <definition name="homepage" extends="baseLayout">
        <put name="title" value="Welcome" />
        <put name="body" value="/jsp/welcome.jsp" />
    </definition>
    <definition name="searchpage" extends="baseLayout">
        <put name="title" value="Welcome" />
        <put name="body" value="/jsp/searchpage.jsp" />
    </definition>
</tiles-definitions>


Step 3: Spring beans configuration

 <!-- Configures the tiles defintions file -->
    <bean id="tilesConfigurer"
        class="org.springframework.web.servlet.view.tiles.TilesConfigurer">
        <property name="definitions">
            <list>
                <value>/WEB-INF/tile/tiles-def.xml</value>
            </list>
        </property>
    </bean>

    <!-- view mappings from localized classpath files -->
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass">
            <value>
                org.springframework.web.servlet.view.tiles.TilesJstlView
            </value>
        </property>
    </bean>

Step 4: Create baselayout.jsp and create all required jsp pages

<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><tiles:insert name="title" ignore="true" /></title>
</head>
<body>
<table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" align="center">
    <tr height="15%">
        <td><tiles:insert name="header" />
        </td>
    </tr>
    <tr height="75%">
    <td>
        <TABLE border="0" cellpadding="0" cellspacing="0" width="100%" height="100%">
        <TR>
            <td height="80%" width="20%"><tiles:insert name="leftPannel" /></td>
            <td width="80%">
                <table>
                    <tr  height="100%">
                        <td>
                            <tiles:insert name="body" />
                        </td>
                    </tr>
                </table>
            </td>
        </TR>
        </TABLE>
    </td>       
    </tr>
    <tr height="10%">
        <td><tiles:insert name="footer" />
        </td>
    </tr>
</table>
</body>
</html>







Step 5: Create & Return model and view object with tiles definition in controller class

            return new ModelAndView("homepage");

Steps to Configure Tiles in Struts 2 Application

Step 1: Add tiles Jars to lib folder


Step 2: web.xml configuration

   <listener>
        <listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
    </listener>

    <context-param>
        <param-name>tilesDefinitions</param-name>
        <param-value>/WEB-INF/tiles.xml</param-value>
    </context-param>

Step 3: Struts 2 action configuration 

<package name="default" namespace="/" extends="struts-default">
<result-types>
    <result-type name="tiles"
        class="org.apache.struts2.views.tiles.TilesResult" />
</result-types>
<action name="ajaxRequestForJsp">
            <result name="successtype="tiles">/ajaxRequestForJsp</result>
</action>
</package>

Step 4:  Create tiles.xml file

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE tiles-definitions PUBLIC       
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"       
"http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>
    <definition name="baseLayout" template="/jsp/baselayout.jsp">
        <put-attribute name="title" value="" />
        <put-attribute name="header" value="/jsp/header.jsp" />
        <put-attribute name="leftPannel" value="/jsp/leftPannel.jsp" />
        <put-attribute name="contentbody" value="" />
        <put-attribute name="footer" value="/jsp/footer.jsp" />
    </definition>
    <definition name="/ajaxRequestForJsp" extends="
baseLayout">
        <put-attribute name="
contentbody" value="/jsp/ajaxJspResponse.jsp" />
    </definition>
</tiles-definitions>  


 Step 5: Create baselayout.jsp and create all required jsp pages


<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="css/ajaxdemocss.css" rel="stylesheet" type="text/css" />
<SCRIPT LANGUAGE="JavaScript" src="javascript/ajax_javascript.js"></SCRIPT>
<SCRIPT LANGUAGE="JavaScript" src="javascript/jquery-1.8.1.js"></SCRIPT>
</head>
<body>
<table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" align="center">
    <tr height="15%">
        <td><tiles:insertAttribute name="header" />
        </td>
    </tr>
    <tr height="75%">
    <td>
        <TABLE border="0" cellpadding="0" cellspacing="0" width="100%" height="100%">
        <TR>
            <td height="80%" width="10%"><tiles:insertAttribute name="leftPannel" /></td>
            <td width="90%">
                <table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%">
                <tr height="70%"><td><tiles:insertAttribute name="contentbody" /></td></tr>
                </table>
            </td>
        </TR>
        </TABLE>
    </td>       
    </tr>
    <tr height="10%">
        <td><tiles:insertAttribute name="footer" />
        </td>
    </tr>
</table>
</body>
</html>

Thursday, 31 July 2014

Steps to configure log4j in spring & struts 2 application

Steps to configure log4j in spring application
***********************************************

Step 1: log4j.properties - needs to place under class path
============================================


#loggging file details for Log4jProperties
log4j.rootCategory=DEBUG,fileAppender
log4j.appender.fileAppender=org.apache.log4j.RollingFileAppender
log4j.appender.fileAppender.File=${jboss.server.home.dir}/log/myAppLog.log
log4j.appender.fileAppender.Encoding=UTF-8
log4j.appender.fileAppender.layout.ConversionPattern=%-4d %-C : %M - %m%n
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout


Step 2: Add jars to lib folder
=======================================


Step 3: web.xml - Log4jConfigListener configuration
=======================================


<listener>
   <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

Step 4: Declare Member Log variable in java calss
======================================

 private final Log       logger  = LogFactory.getLog(getClass());

Step 5: Following logger methods is used to log logger-messages
================================================
=
logger.debug("Controller method");
logger.error("Controller method");
logger.warn("Controller method");
logger.info("Controller method");



Struts 2 Application Log4j Configuration:
*****************************************

Do steps 1, 2, 4, 5

Thursday, 24 July 2014

SQL_PL_SQL

Nth max salary query:

Select salary
From Employee E1
Where (N-1) = (
                                 Select Count(Distinct(E2.Salary))
                                 From Employee E2
                                 Where E2.Salary > E1.Salary

                              )

Partitioned tables:

Oracle allow to divide the rows of a table into multiple parts. Dividing a tables data in this manner is called partitioned table.

Creating table: To create a partitioned table, you have to specify how to set up the partitions of the tables data as part of the create command.

Typically tables are partitioned by range of values. To partition the tables records use the "partition by range" clause. The range will determine the values stored in each of the table partition.

Syntax:

create table table_name (column1 data_type(size), column2 data_type(size),.............)
partition by range (column1)
(partition partition_name1 values < some_value,
partition partition_name2 values < some_value,
partition partition_name2 values < some_value,
-----------------------------------------------
-----------------------------------------------);
You do not need to specify a maximum value for the last partition.

Syntax to select data from partition:

select * from table_name partition(partition_name);

Adding Partition:

Adding new partition to table.

Syntax: alert table table_name add partition partition_name values < value;


Dropping  partition:

Removing partition.

Syntax: alert table table_name drop partition partition_name

Splitting partition:

Splitting one partition into two partitions.

Syntax: alter table table_name split partition partition_name at (value) into (partition partition_name1,partition partition_name2);


Moving partitions:

The move clause of the alter table statement is used to move a partition from a most active table space to different table space in order to balance I/O operations.

Syntax: alter table table_name move partition partition_name tablespace table_space_name;


Work load capturing  

sys> begin
         dbms_wokload_capture.start_capture(name=>'Test_cature_1', dir=>'db_reply_1',     
         duration=>null)
         end;
         /
sys> create user test_1 identified by test_1;

sys> grant connect resource1.create table to test_1;

sys> conn test_1/test_1

test_1> create table db_replay(id number, description varchar2(50), constraint db_replay primary 
              key (id));

test_1> begin
              for i in 1..500000 loop
              insert into db_replay(id, description) values (i,'description_test');
              end loop;
              commit;
              end;
              /
Finishing capture process

conn as sysdba

sys> begin
         dbms_workload_capture.finish_capture;
         end;
         /

Selecting work load capture 

sys> dbms_workload_capture.get_capture_info('DB_REPLAY') from dual;

sys> select id,name from dba_workload_captures;


SQL * Loader
===================================

SQL Loader loads data from external files into tables in oracle data base.

It requires the following files.
1. Data file
2. Control file


Data File: It contains the information to be loaded
Control File: It tells oracle how to read and load the data. It contains the information on the format of the data, the records and fields within the file, The order in which they are to be loaded. It is created at the OS level.

SQL Loader creates the following files.
1. Log file
2. Bad file

Log File: It records the status of the load, such as the number of rows processed and the number of rows committed.

Bad File: It contains rows that are rejected during the load due to data errors.

Syntax:

LOAD DATA
INFILE 'file_name.extension'
BADFILE 'PATH/bad_file_name.bad'
[TRUNCATE | APPEND| INSERT | REPLACE]
INTO TABLE table_name  fields terminated by "," // instead of "," you can specify your delimiter
( column1, column2, column3,.................)

Here column1, column2, column3...................... are names of table column name.
These must be equal to table field names.

TRUNCATE: This clause truncates the table before starting.
APPEND: This clause adds the rows to the table.
INSERT:  This clause adds the rows to an empty table. The load will abort with an error if the table is not empty.
REPLACE: This clause empties the table and then adds the new rows. The user must have DELETE privilege on the table.


Checkpoint Process

CKPT updates the headers of all data files to record the details of the check point.

System Monitor Process  

It performs recovery and also responsible for clean up temporary segments that are no longer in use and for unite contiguous free extents within dictionary managed table spaces. It checks regularly to see whether recovery is needed.

BULK COLLECT AND FORALL

BULK COLLECT: It retrieve multiple rows at a time in single fetch
FORALL: it performes multiple INSERTs | UPDATEs | DELETEs at a time.
Example:
Procedure insertempproc() is
   CURSOR emp_cur IS
      SELECT employee_id
        FROM emp;
cur_limit PLS_INTEGER := 1000;
TYPE multi_cols_pslqltable IS RECORD
(
emp_id   emp.emp_id%TYPE,
emp_name emp.ename%TYPE,
sal        emp.sal%TYPE
);
TYPE multi_cols_pslqltab IS TABLE OF multi_cols_pslqltable;
multi_cols_pslqltab_varr   multi_cols_pslqltab;
BEGIN
open emp_cur;
LOOP
begin
FETCH employees_cur
BULK COLLECT INTO multi_cols_pslqltab_varr
LIMIT c_limit;
       EXIT WHEN multi_cols_pslqltab_varr.COUNT = 0;
FORALL IND IN multi_cols_pslqltab_varr.FIRST..multi_cols_pslqltab_varr.LAST  SAVE              EXCEPTIONS
INSERT INTO EMP_NEW(EMPID,NAM, SAL, CMANE ) VALUES
(multi_cols_pslqltab_varr(IND).emp_id,multi_cols_pslqltab_varr(IND).emp_name,multi_c                  ols_pslqltab_varr(IND).'xyz');
EXCEPTION
  WHEN DUP_VAL_ON_INDEX THEN
  NULL;
end;
   END LOOP;
insertempproc END;