Posts

Showing posts from March, 2019

@Transactional in SpringBoot

Image
Phần này chúng ta sẽ tìm hiểu sức mạnh một lần nữa của @Transactional trong SpringBoot Như bạn đã biết khi một hệ thống tra tấn 1 DB đồng nghĩa với việc khả năng tương tranh dữ liệu trong 1 Giao dịch trong DB xảy ra là rất cao. Tuy nhiên trong thực tế các dự án nhỏ chúng ta thường bỏ qua vấn đề cô lập transaction khi code, hoặc một số là do developer không hiểu hoặc không để ý đến tầm ảnh hưởng của việc tương tranh dữ liệu trong DB. Các bạn nếu là người mới bắt đầu tìm hiểu thì có lẽ bài này sẽ giúp ích phần nào cho bạn hiểu về Cô lập transaction  Bạn có thể đọc wiki để hiểu rõ về các tình huống có thể xảy ra với một transaction https://en.wikipedia.org/wiki/Isolation_(database_systems) Isolation (database systems)  là một trong 4 tính chất ACID mà một DB cần có.  Tôi sẽ đi thẳng vào bốn tình huống  Dirty reads Tình huống này giống như kiểu ví dụ sau đây Bạn có thể thấy hệ thống của bạn đang có 2 transaction cùng truy cập tới một bản ghi có ID=1  Khi tr...

@PropertySource vs @ConfigurationProperties

Trong bài này tôi sẽ hướng dẫn bạn cách tiêm giá trị từ file *.properties vào code trong spring về cơ bản là tôi sẽ tiêm các giá trị như String hoặc số int đơn giản cho bạn dễ hiểu 1. Cách thứ nhất với  @PropertySource bạn dễ dàng làm được điều này, cái tên nó đã gợi nhớ đến tính năng Nguồn thuộc tính tôi ví dụ bạn có một file demo.properties  // đặt cùng cấp với file application.properties trong thư mục resources nội dung file như sau hobby=Reading sex=male mail.from =test@test.com mail.host =test@test.com mail.port =25 mail.security.userName =test mail.security.password =test và class bên dưới được tiêm giá trị vào @Component @PropertySource("classpath:demo.properties") public class DemoProperties { @Value(value = "${mail.from}") String from; @Value(value = "${sex}") String sex; } 2. Cách thứ 2 dùng @ConfigurationProperties cách này bắt buộc phải có setter và getter nhé @Configuration @PropertySource("cl...

@Configuration & @Bean

Ref: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html https://docs.spring.io/spring-javaconfig/docs/1.0.0.M4/reference/html/ch03.html Khi bạn khai báo 1 class với Annotation @Configuration đồng nghĩa với bạn nói với Spring rằng hãy coi class này như là 1 trong những nguồn khởi tạo Bean nhé  Nó giống như là 1 file xml mà khai báo các bean trong đó. Vậy các bean khai báo thế nào trong class này Cách khai báo là bạn dùng @Bean để khai báo các phương thức trả về các đối tượng Bean, các thể hiện này sẽ được đăng ký vào ApplicationContext @Configuration public class HelloWorldConfig { @Bean public HelloWorld helloWorld(){ return new HelloWorld(); } } Đoạn code trên nó tương đương với <beans>    <bean id = "helloWorld" class = "com.mp.HelloWorld" /> </beans> Dưới đây là một ví dụ khác về cách tiêm sự phụ thuộc vào bean @Configuration public class...

@EnableTransactionManagement và @Transacitonal

Khi bạn cần sự hỗ trợ quản lý Transaction từ Spring Framework Hãy nhớ đến @EnableTransactionManagement Thật ra tôi áp dụng SpringBoot v2.1.2.RELEASE cũng không cần áp dụng Annotation này(vì quên). Nhưng thấy vẫn chạy ổn với @Transactional :-)  Với annotation này, bạn đang nói với Spring rằng bạn cần Spring quản lý Transaction cho bạn thay vì bạn sẽ làm việc đó thủ công Done  Nhưng để Spring hiểu rằng một Transaction nào thì Spring sẽ quản lý thì bạn cần phải đánh dấu các transaction cho SpringBoot hiểu  với  @Transacitonal  javax.transaction.Transactional; or org.springframework.transaction.annotation.Transactional Cả 2 annotation này để chạy ổn với rollback hoặc noRollback Nếu bạn đặt level này ở mức class khai báo (cạnh @Service) thì nó sẽ có sức ảnh hươngr đến toàn bộ method khai báo bên trong class này  Nếu bạn muốn Overwrite  ghi đè cho một phương thức nào đó thì bạn đặc thêm @Transactional ở level method.  Done Bây giờ thì bạn ...

Nghĩ về Arraylist tron Java

Trước khi nghĩ về Arraylist chúng ta sẽ nghĩ về ARRAY trước Khi nói đến Array nghĩa rằng bạn đã có một mảng Fix cứng độ dài Ví dụ Array[1000] với độ dài 1000 và array chứa đc 1000 phần tử Vậy khi chúng ta muốn chứa phần tử thứ 1001 thì chúng ta sẽ phải thao tác như thế nào với Array trên ???? Cách duy nhất là chúng ta tạo ra một mảng thứ 2 có độ dài là 2000 phần tử và move các phần tử từ array trên sang Array mới. Rồi sau đó lưu phần tử 1001  --> Độ phức tạp khi lưu 1 phần tử đầu tiên vượt quá độ dài mảng sẽ là O(n) Đó cũng có thể là cách Arraylish hoạt động để lưu không giới hạn phần tử.

JPA useful

Table 3. Supported keywords inside method names Keyword Sample JPQL snippet And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2 Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2 Is,Equals findByFirstname , findByFirstnameIs , findByFirstnameEquals … where x.firstname = ?1 Between findByStartDateBetween … where x.startDate between ?1 and ?2 LessThan findByAgeLessThan … where x.age < ?1 LessThanEqual findByAgeLessThanEqual … where x.age <= ?1 GreaterThan findByAgeGreaterThan … where x.age > ?1 GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1 After findByStartDateAfter … where x.startDate > ?1 Before findByStartDateBefore … where x.startDate < ?1 IsNull findByAgeIsNull … where x.age is null IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null Like findByFirstnameLike … where x.firstname like ?1 NotLike find...

Hiểu cách https làm việc

Image
Ref: https://strongarm.io/blog/how-https-works/ Nếu bạn là một người không quan tâm đến bảo mật dữ liệu thì bạn không cần phải đọc bài viết này. Nếu bạn thuộc phần còn lại thì tôi nghĩ bạn đã đọc đúng bài báo này bằng tiếng Việt Tôi sẽ nói vấn đề Http trước và tại sao cần phải loại bỏ ngay khi nếu hệ thống có dùng một phương thức truy cập nào đó mà cần người dùng xác thực. Tiếp theo sẽ là vấn đề Https mà người dùng tự Generate Cert rồi add vào server và dùng nó như là một Cert bảo mật dữ liệu Và cuối cùng là HTTPS và tại sao nó lại cần thiết trong internet hiện nay. Bạn phải bắt buộc dùng nó như là một cách bảo mật truy cập hệ thống. Let's start 1. HTTP Bạn biết rằng HTTP đã phát triển rất lâu và cho đến thời điểm này các hệ thống vẫn dùng http do một  trong những lý do sau (tôi chủ quan liệt kê) - Một phần là do hệ thống đó chỉ cung cấp tin tức hoặc dữ liệu công khai, không nhạy cảm - Do người admin hệ thống không hiểu đến bảo mật và tính...