java convert resultset to json

งานลักษณะที่มีการต่อ db ตรงโดยไม่ใช้ JPA query ข้อมูลได้เป็น resultset และจำเป็นต้องแปลงเป็น json เช่น oracle database changed event งานที่ได้รับจำเป็นต้องแปลงข้อมูลที่ได้จาก resultset เป็น json เพื่อไปเก็บบน firebase เราสามารถใช้ method นี้แปลงได้เลย

public JSONArray convertToJSON(ResultSet resultSet) throws Exception {
   JSONArray jsonArray = new JSONArray();
   while (resultSet.next()) {
       int total_rows = resultSet.getMetaData().getColumnCount();
       JSONObject obj = new JSONObject();
       for (int i = 0; i < total_rows; i++) {
          obj.put(resultSet.getMetaData().getColumnLabel(i + 1).toLowerCase(), resultSet.getObject(i + 1));
          jsonArray.put(obj);
       }
   }
   return jsonArray;
}

reference http://biercoff.blogspot.com/2013/11/nice-and-simple-converter-of-java.html

Posted in java | Leave a comment

ตั้งค่า Google’s crawl rate ใน google webmaster tools

หากใครเคยเจอปัญหา โดน google bot ถล่มจนเว็บล่ม เพราะจำนวน index เว็บเราเยอะ โดน google bot ถล่มหน้าเว็บที่มีการเรียก API ที่ซื้อมาและมี limit quota ขอแนะนำวิธีบรรเทาทุกข์ เปลี่ยนแปลงอัตราที่ google เข้ามาไต่เว็บเรา (ไม่มีผลต่ออันดับ)

ให้เข้าไปตั้งค่าที่ google web master tool > site setting > crawl rate > Limit Google’s maximum crawl rate

ยกตัวอย่าง
A Crawl-delay: สมมติตั้งค่าเรท 30 วิ google จะเก็บหน้าเว็บเรา 1,000 หน้า ใช้เวลา 8.3 ชม.

A Crawl-delay: สมมติตั้งค่าเรท 500 วิ (Low Rate) google จะเก็บหน้าเว็บเรา 1,000 หน้า ใช้เวลา 5.8 วัน

หรือจะใช้วิธีใส่ rel=nofollow ใน tag <a> ก็ช่วยได้เช่นกัน แต่ต้องคิดพิจารณา ว่าควรใช้ตรงไหนถึงจะดีที่สุด

Posted in knowledge | Leave a comment

spring boot direct sql by entitymanager

ใครที่ใช้ Spring boot เชื่อมต่อ database ด้วย JPA เราจะคุ้นเคยกับคำสั่งของมันเช่น save() , findById(), findByField() แต่เมื่อไรที่ลักษณะงานของเรานั้น ต้องรับค่า input มาเป็น raw sql เราจะทำอย่างไร

ใช้งานใน Spring (@Controller,@RestController,@Service,@Repository)

import javax.persistence.EntityManager;
import org.hibernate.SQLQuery;
import org.hibernate.Session;

@PersistenceContext
private EntityManager entityManager;

.....

Session session = entityManager.unwrap(org.hibernate.Session.class);

String sql = "update TABLE set FIELD = y where FIELD_WHERE = 'xxx'";

SQLQuery query = session.createSQLQuery(sql);
int result = query.executeUpdate();

return String.valueOf(result);

ใช้งานนอก Spring ยืมการใช้งานผ่าน service

@Service
public class SomeServiceImpl implements SomeService {

    @PersistenceContext(unitName = "your_persistence_unit_name")
    private EntityManager entityManager;

    @Override
    @Transactional("transactionManager")
    public Session getSession() {
        return entityManager.unwrap(org.hibernate.Session.class);
    }
}

public class Foo{

    public void someMethod(){
        SomeService someService =
        ApplicationContextProvider.getApplicationContext().getBean(SomeService.class);
        Session session = someService.getSession().getSessionFactory().openSession();
        ....
    }
}

@PersistenceContext
A persistence context handles a set of entities which hold data to be persisted in some persistence store (e.g. a database). In particular, the context is aware of the different states an entity can have (e.g. managed, detached) in relation to both the context and the underlying persistence store

Session session = utilService.getSession().getSessionFactory().openSession();
Posted in spring boot | Leave a comment

spring boot @SpringBootApplication,@EnableAutoConfiguration ใช้ทำอะไร

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(LoginApplication.class, args);
    }
}

The Spring Boot documentation อธิบาย @SpringBootApplication ไว้ว่า

The @SpringBootApplication annotation is equivalent to using @Configuration, @EnableAutoConfiguration and @ComponentScan with their default attributes: [...]

Many Spring Boot developers always have their main class annotated with @Configuration, @EnableAutoConfiguration and @ComponentScan. Since these annotations are so frequently used together (especially if you follow the best practices above), Spring Boot provides a convenient @SpringBootApplication alternative.

“เนื่องจากโปรแกรมเมอร์จำนวนมาก ใช้ annotated 3 อันนี้ร่วมกันบ่อยครั้ง @Configuration,@EnableAutoConfiguration และ @ComponentScan จึงยุบรวมอยู่ใน @SpringBootApplication ไปเลย”

ทีนี้เรามาดูกันว่า Annonation 3 ตัวนี้ทำหน้าที่อะไร

  1. @Configuration tags the class as a source of bean definitions for the application context. (Class ที่มี source ของ Bean ด้วย method ที่มี @Bean)
  2. @EnableAutoConfiguration It tells Spring to setup some basic infrastructure judging by what you have in the classpath. It’s done by invoking a so called import class that’s derived from the value of the @Import annotation that @EnableAutoConfiguration includes. Only one class should be annotated with @EnableAutoConfiguration (โหลดใช้งาน Required Bean ที่จำเป็นให้เราอัตโนมัติ เช่นถ้าใช้ JPA มันก็จะมองหา @Entity ให้อัตโนมัติ)
  3. @ComponentScan tells Spring to look for other components, configurations, and services in the the root package, allowing it to find the controllers. (บอกให้ Spring รู้จัก Annotated ภายใต้ Package ที่ระบุ ถ้าไม่ระบุก็จะเป็น ภายใต้ Package ของ Class ที่ใส่ @ComponentScan)

ถ้าหากต้องการ Custom เราสามารถใส่ Annotated เพิ่มเติมได้ เช่น หากเราไม่ต้องการโหลด Config บางตัวอัตโนมัติ

@SpringBootApplication
@EnableAutoConfiguration(exclude = LiquibaseAutoConfiguration.class)
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(LoginApplication.class, args);
    }

}

แหล่งอ้างอิง

https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-using-springbootapplication-annotation.html

https://stackoverflow.com/questions/33619532/configuration-using-annotation-springbootapplication

https://stackoverflow.com/questions/39247487/why-spring-boot-application-class-needs-to-have-configuration-annotation

Posted in spring boot | Leave a comment

spring boot transactional force commit

บางครั้งถ้ามี Query หลายๆ Statement ต่อกัน อาจทำให้เกิดข้อผิดพลาด Constraint เช่นพวก Unique ได้ เพราะมันจะรอ commit พร้อมกัน เราจึงต้องย้ายบาง Statement ไปสร้างเป็น method ใหม่ และใส่ Annonation นี้ไว้บนหัว method เพื่อที่จะ force commit

@Transactional(value = "transactionManager",propagation = Propagation.REQUIRES_NEW)

https://stackoverflow.com/questions/24338150/how-to-manually-force-a-commit-in-a-transactional-method

Posted in jquery, spring boot | Leave a comment